以下是示例:
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,我不想让人知道三个类?
答案 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规范指出:
实体类必须是顶级类。枚举或接口必须 不被指定为实体