2014-04-10 211 views
1

可以說我有類似於下面的對象模型:映射JPA實體繼承層次

abstract class Vehicle { 
    String guid; 
    String name; 
    Double price; 
} 
class SUV extends Vehicle { 
    Integer towingCapacity; 
} 
class Hybrid extends Vehicle { 
    Integer batterySize; 
} 

我需要使用JPA和該層次結構映射到數據庫中。我選擇去與「連接表每類」的做法,因爲這裏概述:http://java.dzone.com/articles/jpa-implementation-patterns-mapping

所以基本上我有一個Vehicle父表,與具有外鍵VehicleSUVHybrid表。我選擇這個解決方案的原因是我喜歡規範化的模式,此外Vehicle.guid需要全局唯一,所以擁有一個帶有該字段的父表(而不是分散在單個表中)簡化了這個UNIQUE約束。

我還是比較新的JPA,我不知道如何將它們設置爲JPA實體。 Vehicle是否會成爲MappedSuperclass?另外,我知道我需要爲每個實體添加@Id,但SUVHybrid將使用Vehicle表的外鍵,還是必須使用子表中的主鍵作爲標識符?

在此先感謝。

回答

1

該id爲整個層次結構定義一次並且是繼承的,因此Vehicle類中的@Id屬性就足夠了。

@MappedSuperclass意味着該類未映射到單獨的表,而是它的子表的一部分。如果你想要一個規範化的模式,也可以將Vehicle作爲一個實體。

您不需要爲子實體定義外鍵。這是由持久性提供者完成的,對開發人員來說可以是透明的。

請注意,JOINED繼承策略的性能低於默認的SINGLE_TABLE策略。 SINGLE_TABLE需要更多的空間,並不真正支持派生實體的不可爲空的列。

+0

所以根據你的建議,我有'Vehicle','SUV'和'Hybrid'所有實體。 'Vehicle'有@Id和'SUV','Hybrid'沒有@Id,只有必要的@Column。當我試圖用該設置堅持SUV時,我收到一個錯誤消息,說明沒有找到Vehicle Vehicle,直接在下面試圖準備一個包含Vehicle和SUV表中每列的表格Vehicle的聲明。 PU似乎並沒有實現層次結構。有任何想法嗎? – user1491636

+0

抱歉,我遺失了SUV實體上的@PrimaryKeyJoinColumn(name =「VehicleId」,referencedColumnName =「VehicleId」)'和'Vehicle'實體上的'@Inheritance(strategy = InheritanceType.JOINED)'。這已經解決了上面準備好的問題,但仍然沒有找到表。 – user1491636

+0

奇怪的是,如果我在創建持久性單元中更改表生成策略,那麼一切正常。我無法找到表格的創建位置。必須是持久性單元的問題,我沒有看到。但至少堅持工作:)謝謝。 – user1491636