如何在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 {

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
public class Address {
    String city;
}

将映射到Employee中的另一个表。city属性将被替换

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

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

最新更新