2013-01-15 100 views
1

實體超級I類有實體的,像這樣一個簡單的類層次結構:創建關聯使用JPA

 
Permissable (super class) 
\ 
PermissableResource (sub class) 

他們堅持在一個表像這樣:

 
Permissable 
------------- 
id   PK 
resource FK Resource(resourceId) 

我有另一個我想與之建立關聯的實體名稱爲Resource。它是在一個表中堅持像這樣:

 
Resource 
------------- 
resourceId PK 

在我PermissableResource類,我創建了聯想,像這樣:

@JoinColumn(name="resource", referencedColumnName="resourceId") 
@ManyToOne 
Resource resource; 

問題附帶了資源類。我想參考超類Permissable而不是子類PermissableResource。我嘗試建立關聯,像這樣:

@OneToOne(mappedBy="resource", cascade= CascadeType.ALL, targetEntity=PermissableResource.class) 
private Permissable permissiable; 

但是這會導致上部署了以下錯誤:

Exception Description: The attribute [permissiable] in entity class [class com.dv.oa.model.entity.resource.Resource] has a mappedBy value of [resource] which does not exist in its owning entity class [class com.dv.oa.model.entity.permission.permissable.Permissable]. If the owning entity class is a @MappedSuperclass, this is invalid, and your attribute should reference the correct subclass.. Please see server.log for more details. 

它在尋找Permissable的關聯,而不是在PermissableResource

我認爲因爲我使用屬性@OneToOne並將其指向PermissableResource.class這可以起作用。我如何在我的實體中保留超類參考,但將其映射到子類?

+0

如果'Permissable'可以是抽象的,[inheritance](http://en.wikibooks.org/wiki/Java_Persistence/Inheritance)是我建議的選項。 – perissf

回答

0

我認爲問題在於你在PermissableResource中定義了@ManyToOne關係,而在Resource類中定義了@OneToOne。嘗試用@OneToMany代替後者。

+0

好的,讓我給一個鏡頭 – user489041