在 Roman 的回答中,它不一定是表名。确实存在鉴别器的想法。
所以就表格而言,这看起来像:
create table house ( id .., ..., primary key (id) )
create table user ( id .., ..., primary key (id) )
create table car ( id .., ..., primary key (id) )
create table comment( id ..., commenter ..., commented_id ..., commented_type ... )
有几种方法可以将歧视应用于这样的一组关系。
首先是您可以使 Comment 本身成为一个层次结构并使用基于鉴别器的子类化。这种方法的缺点是子类完全没有价值,只服务于持久性的需要。这种方法的优点是它可以与任何 JPA 提供程序一起使用。要使用这种方法,您将拥有:
@Entity
@Table( name="comment" )
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="commented_type")
public abstract class Comment {
@Id
@Column( name="id" )
private Long id;
...
}
@Entity
public class HouseComment extends Comment {
@ManyToOne
@JoinColumn(name="commented_id")
private House getHouse();
...
}
etc...
就像我说的,有点丑。
Hibernate,专门为您提供了其他选项来处理此问题。例如,使用其“任何”映射的概念:
@Entity
@Table( name="comment" )
public class Comment {
@Id
@Column( name="id" )
private Long id;
@Any( metaColumn = @Column( name="commented_type" ) )
@AnyMetDef(
idType = "long"
metaValues = {
@MetaValue( value="C", targetEntity=Carclass ),
@MetaValue( value="H", targetEntity=House.class ),
@MetaValue( value="U", targetEntity=User.class )
}
)
pubic Commentable getCommentTarget { ... }
}
public interface Commentable {
...
}
@Entity
public House implements Commentable {
...
}
etc...