如何在JPA映射中将Joined Inheritance与Secondary Table结合起来?

时间:2014-09-01 14:37:10

标签: hibernate jpa

我有两个从事继承的课程。

BaseEntity creates a record in enrg table.
Website creates a record in ws table.

这很好用。现在,我想向网站添加与其他实体相同的属性。我不想将它们直接放在网站实体上,因为它有很多重复。同时,这些属性并非所有实体都通用,因此我也不想将它们添加到BaseEntity中。

我创建了一个新类PublishableEntity,其中添加了这些属性。现在,我试图以这样的方式映射网站,

BaseEntity creates a record in enrg table.
PublishableEntity creates a record in pbdt table.
Website creates a record in ws table.

使用下面的代码,PublishableEntity完全被忽略。我没有看到任何错误。似乎Hibernate甚至没有选择映射。

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="entp", discriminatorType=DiscriminatorType.STRING)
@Table(name="enrg")
public abstract class BaseEntity implements Serializable {

@SecondaryTable(name="pbdt", pkJoinColumns=@PrimaryKeyJoinColumn(name="enid", referencedColumnName="enid"))
public abstract class PublishableEntity extends BaseEntity {

@Entity
@DiscriminatorValue("ws")
@Table(name="ws")
public class Website extends PublishableEntity {

1 个答案:

答案 0 :(得分:0)

JPA提供商仅扫描使用@Entity@Embeddable@MappedSuperclass注释的类。

您也可能忽略了辅助表的要点。辅助表表示实体的一部分存储在第二个表中。例如:

@Entity
@SecondaryTable(name="ADDRESS",pkJoinColumns=@PrimaryKeyJoinColumn(name="EMP_ID"))
public class Employee {
    @Id int id; // stored in table EMPLOYEE
    @Column(table="ADDRESS")
    String city; // stored in table ADDRESS
}

您可能希望将地址识别为类型。为此,您可以创建一个Embeddable

@Embeddable
public class Address {
    String city;
}

将映射到Employee中的其他表。 city属性将替换为

@Embedded
@AttributeOverrides({
    @AttributeOverride(name="city", column=@Column(table="ADDRESS"))
})
Address address;

在您的具体情况下,PublishableEntity可能会成为可嵌入的。