JPA关系和继承配置

时间:2015-12-23 10:08:27

标签: jpa inheritance

以下是示例:

Class Person
Interface Address
Class EmailAddress
Class HomeAddress
Class OfficeAddress

类Person的注释

@Entity
@Table(name = "Persson")

在人物中有属性 - 地址

@OneToOne(targetEntity = Address.class, mappedBy = "person")
private Address address

和接口地址。地址是一个接口。我不想在db中创建表。我希望它的子类有它自己的表

课堂上的注释是

@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

和财产 - 人是

@ManyToOne(targetEntity = Person.class, cascade = CascadeType.ALL)
private Person person;

但它不起作用。 当我将地址注释更改为

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

它可以工作,但它会创建一个新表。

我的问题是如何在不创建地址表的情况下使其工作?我只需要三个表,EmailAddress,officeAddress和homeAddress,我不想让人知道三个类?

1 个答案:

答案 0 :(得分:0)

鉴于您正在尝试使用InheritanceType.TABLE_PER_CLASS我猜测问题是您在数据库级别没有任何关系时尝试使用继承,即。在数据库中,Home Address和Office Address之间没有关系。

https://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Mapped_Superclasses

  

映射的超类继承允许在继承中使用继承   对象模型,当它在数据模型中不存在时。它很相似   每个类继承表,但不允许查询,   坚持,或与超类的关系。其主要目的是   允许映射信息由其子类继承。

在这种情况下,您只需要在地址上使用@MappedSuperclass注释并删除所有@Inheritance注释。如上所述,@MappedSuperclass不能成为关联的目标。所以你不能拥有:

@OneToOne(mappedBy = "person")
private Address address

但需要做

@OneToOne(mappedBy = "person")
private HomeAddress homeAddress

@OneToOne(mappedBy = "person")
private OfficeAddress homeAddress

关于接口,JPA规范指出:

  

实体类必须是顶级类。枚举或接口必须   不被指定为实体