Java Hibernate实体多态性,使用@MappedSuperclass注释
考虑以下模型: 抽象类抽象日志Java Hibernate实体多态性,使用@MappedSuperclass注释,java,hibernate,jpa,orm,hibernate-mapping,Java,Hibernate,Jpa,Orm,Hibernate Mapping,考虑以下模型: 抽象类抽象日志 @MappedSuperclass public abstract class AbstractLog{ private Long id; private Set<Comment> comments; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "quasar_log_id_seq") public Long getI
@MappedSuperclass
public abstract class AbstractLog{
private Long id;
private Set<Comment> comments;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "quasar_log_id_seq")
public Long getId() {
return id;
}
@OrderBy(clause = "created")
@OneToMany(mappedBy = "abstractLog", fetch = FetchType.LAZY, cascade = { CascadeType.ALL }, orphanRemoval = true)
public Set<Comment> getComments() {
return comments;
}
// setters
}
@Entity
@SequenceGenerator(name = "quasar_log_id_seq", sequenceName = "quasar_log_id_seq")
public class AuditLog extends AbstractLog {
private Set<AuditLogItem> items;
@OrderBy(clause = "date")
@OneToMany(mappedBy = "auditLog")
public Set<AuditLogItem> getItems() {
return items;
}
}
@Entity
@SequenceGenerator(name = "quasar_log_id_seq", sequenceName = "quasar_log_id_seq")
public class DocumentationLog extends AbstractLog {
private Set<DocumentationLogItem> items;
@OrderBy(clause = "date")
@OneToMany(mappedBy = "documentationLog")
public Set<DocumentationLogItem> getItems() {
return items;
}
}
您会注意到,ID序列生成器对于AbstractLog
的所有扩展实体都是相同的
其目的是,在
AbstractLog
的所有扩展实体之间共享实体Comment
。是否可以使用注释@MappedSuperclass
?如果我使用了@heritation
注释,那么类AbstractLog也将被创建,但我不希望这样。当前抛出引用未知实体错误。@MappedSuperclass用于继承属性,但由于它不表示实体,因此可以使用实体关系,因此只剩下基本类型、id生成和乐观锁定版本
如果不希望基类是它自己的表(例如,每个子类的表),可以使用每个具体类的表策略。每个实体都有自己的表,继承的属性只会为Java带来方便,因为它们将在每个SQL表中重复
因此,您可以将@MappedSuperclass替换为:
@Inheritance(InheritanceType.TABLE_PER_CLASS)
但根据:
默认情况下是单表继承,每个类的表是
JPA规范的可选特性,因此并非所有提供商都支持它
Hibernate支持它,但如果您计划使用其他JPA提供程序,您可能不支持它
@Inheritance(InheritanceType.TABLE_PER_CLASS)