2014-02-05 94 views
0

在高層次上,我有一個「MainElass」類,它有一個「OtherEntity」列表。基本上有兩個連接表。這兩個連接表中有其他組件使用的元數據,但我沒有定義實體,因爲我們在連接操作之外不需要它們。但基本上MainClass => TableOne => TableTwo => OtherEntity如何在JPA中使用多個表來表示OneToMany關係?

我的實體定義

@Entity 
public class MainClass { 

    // other stuff ... 

    // how to? 
    @OneToMany 
    private List<OtherEntity> otherEntities; 
} 


@Entity 
public class OtherClass { // other stuff ... } 

我的模式(傳統的和不能被修改)

table MainClass 
    PK id 
    ... 

table TableOne 
    PK id 
    FK main_class_id 
    FK table_two_id 

table TableTwo 
    PK id 
    FK table_one_id 
    FK other_entity_id 

table OtherEntity 
    PK id 
    ... 

我想避免給實體TableOne和TableTwo,如果我可以的話。

回答

0

這個問題是一個最終將解決的設計問題。我們有一個數據庫視圖,提供了一個統一的查找表。在數據庫層中,我們可以單獨分配這些部分。

@Entity 
public class MainClass { 

    @OneToMany 
    @JoinTable(name = "TheViewName", 
     joinColumns = @JoinColumn(name = "id", insertable = false, updatable= false), 
     inverseJoinColumns = @JoinColumn(name = "other_id", insertable = false, 
      updatable = false)) 
    private List<OtherEntity> otherEntities; 
} 

這意味着我不能分配新的其他實體的MainClass,堅持兩者。我必須做兩個單獨的操作才能完成任務。但是,當我們重構模式時,這將消失。

或者,我們可以爲其他兩個表創建實體,以使操作更透明。

1

考慮使用@SecondaryTable它應該適用於傳統模式,使用此註釋可以在一個實體中包含字段,並且只需定義哪些將構成其他表的一部分,但只有2個實體。

檢查this教程

理念是從一個實體在不同的表分割字段而不需要其他實體的建立,只是定義哪些字段的表。

@SecondaryTables{@SecondaryTable(name="XX")} 

,並在表之間移動領域使用

@Column(table="XX") 

在你的配置嘗試這樣的事情。

@Entity 
@SecondaryTables{@SecondaryTable(name="TableOne"), @SecondaryTable(name="TableTwo")} 
table MainClass 
    PK id 
    @Column(table="TableOne") 
    FK main_class_id 
    @Column(table="TableOne") 
    FK table_two_id 

    @Column(table="TableTwo") 
    PK id 
    @Column(table="TableTwo") 
    FK table_one_id 
    @Column(table="TableTwo") 
    FK other_entity_id 

對於中間表中的ID,考慮刪除@Id並自動設置它應該工作!

+0

這是一個有趣的概念。但是,不應該在OtherEntity類上註釋@SecondaryTables,以便從其他表中抽取FK? – predhme

+0

好吧,需要檢查設計,可能更有意義兩個有一個實體其中一些實體和其他實體中的其他實體,考慮審查您的設計,以便更有意義時應用二級表。它可以幫助你像我的答案一樣考慮XD – Koitoer

+0

我很欣賞對輔助表的洞察力,因爲它可能提供用於不同的問題。但是,我不知道我們有一個提供統一表格的觀點。我只是在視圖中指出了joinTable註解,問題就解決了。 – predhme

相關問題