簡體   English   中英

按類型表映射子類(多對一休眠)

[英]Mapping Sub-Classes by Type Table (Many-To-One Hibernate)

我必須制作一個拼貼項目的域層。 我們幾乎沒有標准,例如我們必須使用Hibernate,數據庫也已修復。

數據庫的相關部分幾乎如下所示:

總線實體 (表1)

  • BusId
  • 公交專用信息

總線類型 (表2)

  • BusTypeId
  • 座位
  • ...
  • 子類鑒別器

我遇到的問題是,在域層中有2種類型的總線通過BusType表中的標識符進行區分:

@Entity
class Bus
{
   @Id
   int _id;
   ...
}

@Entity
class BusSubClass1 extends Bus
{
   ...
}

@Entity
class BusSubClass2 extends Bus
{
   ...
}

有沒有辦法用Hibernate和JPA映射類似的東西? 謝謝你的回答。

喬欽·莫倫特

是的,幾乎沒有辦法映射這種情況。 JPA支持三種不同的數據表示形式:

  • 單表策略
  • 聯合策略
  • 逐表策略

換句話說,根據所使用的繼承類型,您將獲得不同的數據庫模型。 各種JPA提供程序可能支持其他繼承策略。

考慮以下示例:

@Entity
@Inheritance //by default SINGLE_TABLE strategy
@DiscriminatorColumn( //not supported for TABLE_PER_CLASS strategy
    name = "BUS_TYPE", 
    discriminatorType = DiscriminatorType.INTEGER
)
public abstract class Bus {
    @Id
    protected int id;
    protected int seats;

    public Bus() {
    }
}

@Entity
@DiscriminatorValue(value = "1") //not supported for TABLE_PER_CLASS strategy
public class BusSubClass1 extends Bus {
    private String specific1;

    public BusSubClass1() {
    }
}

@Entity
@DiscriminatorValue(value = "2") //not supported for TABLE_PER_CLASS strategy
public class BusSubClass2 extends Bus {
    @Temporal
    private Data specific2;

    public BusSubClass2() {
    }
}

使用InheritanceType.SINGLE_TABLE策略將導致一個包含所有具體實體類型的數據庫表:

 Bus

 ID BUS_TYPE SEATS SPECIFIC1 SPECIFIC2
 -- -------- ----- --------- ---------
 1  1        50    qwerty
 2  1        55    asdfgh
 3  2        30              2014-01-01
  • 繼承層次結構中的每個具體實體實例都通過區分符值進行區分(此處由BUS_TYPE列指示)
  • 所有數據庫列都必須聲明為空,因為並非所有數據庫列都可能包含值(因此,對於無法設置為null的列可能會出現問題)
  • 寬或深的層次結構可能會影響性能(表中分別有很多冗余的列或行)
  • 缺乏規范化會浪費數據庫表中的空間
  • 為讀取和寫入操作提供良好的性能(多態查詢不需要連接,僅需要鑒別符值)
  • 添加/刪除實體字段可能有問題(從數據庫管理的角度來看)

使用InheritanceType.JOINED策略會導致每個實體類型具有多個數據庫表(來自Bus所有共享字段都存儲在相應的表中):

 Bus                        BusSubClass1          BusSubClass2

 ID BUS_TYPE SEATS          ID SPECIFIC1          ID SPECIFIC2
 -- -------- -----          -- ---------          -- ---------
 1  1        50             1  qwerty             3  2014-01-01
 2  1        55             2  asdfgh
 3  2        30
  • 繼承層次結構中的每個具體實體類都通過鑒別符值進行區分(此處由BUS_TYPE列指示)
  • 標准化可改善數據存儲(與SINGLE_TABLE策略相比,減少了未使用的空間)
  • 非多態查詢(針對單個具體實體)需要聯接
  • 多態查詢(用於實體類的廣泛或深入層次結構)需要多個聯接,並且可能很昂貴
  • 添加/刪除實體字段非常簡單(從數據庫管理的角度來看)

使用InheritanceType.TABLE_PER_CLASS策略可以為每種實體類型精確地提供一個數據庫表(在特定的子類中重新定義了Bus所有共享字段):

 BusSubClass1                BusSubClass2

 ID SEATS SPECIFIC1          ID SEATS SPECIFIC2
 -- ----- ---------          -- ----- ---------
 1  50    qwerty             3  30    2014-01-01
 2  55    asdfgh                     
  • 繼承層次結構中的每個具體實體類僅通過共享標識符來區分(不使用鑒別​​符)
  • 規范化改善了數據存儲(與SINGLE_TABLE策略相比,未使用的空間更少,但比JOINED策略的情況要多)
  • 非多態查詢(對於單個具體實體)非常有效,因為不需要連接
  • 多態查詢(用於實體類的廣泛或深入層次結構)需要多個聯接,並且可能很昂貴
  • 添加/刪除實體字段非常簡單(從數據庫管理的角度來看)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM