我有一個JPA繼承的問題。見下面我的實體。我有一個Person
,可以在House
或Car
,當然從不在同一時間。接口Car
和House
實現PersonHoldable
接口。我知道我無法將一個實體直接映射到一個接口。JPA繼承映射多個實現
這是我的模型:
@Entity
public class Person{
private PersonHoldable personHoldable; // either a Car or a House
// This does not work of course because it's an interface
// This would be the way to link objects without taking JPA into consideration.
@OneToOne
public PersonHoldable getPersonHoldable() {
return this.personHoldable;
}
public void setPersonHoldable(PersonHoldable personHoldable) {
this.personHoldable = personHoldable;
}
}
@Entity
public class Car implements PersonHoldable{}
@Entity
public class House implements PersonHoldable{}
public interface PersonHoldable{}
我怎樣才能在JPA正確映射該採取以下考慮?
- 我試過
@MappedSuperclass
對PersonHoldable
的抽象實現。雖然它可以用於這個特定的設置,但問題在於Car
和House
實際上實現了更多的接口。它們也映射到其他實體。 Person
可能有一個屬性爲每個可能PersonHoldable
,因此在這種情況下它可能有一個getCar()
和getHouse()
屬性。這對我來說似乎並不靈活。如果我要添加一個Bike
PersonHoldable
的實現,我將不得不更改我的Person
類。- 我可以映射另一種方式,所以在
PersonHoldable
實現端只有OneToOne關係。這意味着將getPerson()
屬性添加到PersonHoldable
。但是,從Person
的角度來看,它並不是很容易看到它與什麼PersonHoldable
相關聯。 - 我使用默認的JPA,所以如果可能的話,沒有Hibernate特定的標籤。
如果這對於默認JPA是不可能的,那麼在這種情況下最好的做法是什麼?
這不支持標準的JPA。它需要一個'@ Any'休眠映射來映射這種關聯。 –
謝謝,似乎Hibernate'@ Any'不過是兩列,一列包含'type',另一列包含'id'。可以手動實施。這是常見的做法嗎? –
除了生成適合您的所有查詢之外,它只是「沒有更多」,例如「從Person p左連接獲取p.personHoldable」中選擇p,並且它允許導航到personHoldable而不必關心它是什麼類型。使用這種映射常見的做法是什麼?我從來沒有必要自己使用它。我寧願定義一個所有PersonHoldable實體都會擴展的抽象實體。這將是標準的JPA。 –