2015-12-23 93 views
0

下面是例如:JPA關係和繼承配置

Class Person 
Interface Address 
Class EmailAddress 
Class HomeAddress 
Class OfficeAddress 

類人註釋

@Entity 
@Table(name = "Persson") 

有屬性 - 地址在人

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

和用於接口地址。地址是一個接口。我不想在db中創建表。我希望它的子類有它自己的表

類註釋是

@MappedSuperclass 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 

和property--人

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

,但它不工作。 當我更改地址註釋

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 

它的工作,但它會創建一個新表。

我的問題是如何使它工作,而無需創建一個地址表?我只需要三張表,EmailAddress,officeAddress和homeAddress,我不想讓人知道三個類?

+0

地址是一個接口 – ChandlerSong

+0

抱歉,我犯了一個錯誤,我已經固定它。 – ChandlerSong

回答

0

鑑於你正在嘗試使用InheritanceType.TABLE_PER_CLASS我猜測問題是你正試圖在數據庫級別沒有關係時使用繼承,也就是說,在數據庫中,家庭地址和辦公地址之間沒有關係。

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

映射超繼承允許在 對象模型中使用繼承,當它不在數據模型中存在。它類似於每個類繼承的表 ,但不允許查詢, 持久化或與超類的關係。它的主要目的是讓 允許映射信息被其子類繼承。

在這種情況下,您只需要在Address上使用@MappedSuperclass註釋並刪除所有@Inheritance註釋。如上所述,@MappedSuperclass不能成爲關聯的目標。所以你不能有:

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

,但需要做的

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

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

關於接口,JPA規範中指出:

實體類必須是頂級類。枚舉或接口必須 不能被指定爲實體

+0

如何配置Person。我希望Person只能與Address建立關係。 – ChandlerSong

+0

如上所述,如果地址僅爲MappedSuperclass,則人員不能與地址建立關係。 2個地址表的表結構是什麼? –

+0

你可以改變數據庫模式嗎? –