2014-01-28 41 views
0

我有我不知道其可能的JPAJPA - 加入不同的表取決於柱類型

如果我讓一個問題,說表一

public class A { 
    Long id; 
    Long type; 
    Details details; // can this connect to B or c depends on type? 
} 

和表B和C是兩個不同的細節表。 (不知道有什麼共同點) 我可以連接B或C到A取決於A.type

感謝

阿龍

編輯:讓我嘗試更準確

我有實體

@Entity  
@Table(name = "tbl_A") 
public class A implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

@Id 
private Long id; // seems like spring's jpa has issue hanlde "_" 

    /* 
    *can i achive some thinglike 
    * if detailsTableType== 1 use Details as B table 
    */ 


    @OneToOne(mappedBy = "details", cascade = CascadeType.ALL) 
    @PrimaryKeyJoinColumn 
    private B details; 

    /* 
    *can i achive some thinglike 
    * if detailsTableType== 2 use Details as C table 
    */ 

    @OneToOne(mappedBy = "details", cascade = CascadeType.ALL) 
    @PrimaryKeyJoinColumn 
    private C details; //Details 

    /* 
     * this field set the from where the join should be 
     */ 

    private Long detailsTableType; 

} 

注意B,C 一定分享任何東西共同點

編輯2:

一個可能的解決方案可以是使用吸氣某種黑客。這意味着: 映射在A所有可能的連接(將它們標記爲惰性)並創建一個獲取器,它將知道它應該使用哪個類型的連接..

+0

你在這裏真正擁有的是具有多個「A」子類的類層次結構。一種'A'具有'B'細節對象,另一種具有'C'細節對象。這就像hibernate的Table-per-subclass和table-per-class-hierarchy例子的組合。見http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/inheritance.html#inheritance-mixing-tableperclass-tablepersubclass –

回答

2

我想你想添加一些細節到一個實例從A類繼承B和C類。 我建議您閱讀有關繼承和鑑別器值/列的文檔。

hibernate的文檔,你將看到如何 - 使用繼承和TABLE_PER_CLASS戰略 的概念 - 和描述descriminator列(你的類型列)

編輯:,但我建議您使用另一種策略,如SINGLE_TABLE_PER_CLASS。請注意,JPA提供程序不必支持TABLE_PER_CLASS策略,而且,此特定策略對性能也有影響。好吧,我建議你使用B和C類的多態性,因爲它們使用共同的東西=>鏈接的基類A!

你可以有:

Class A 
* Member list of DetailsItf 

DetailItf (interface) 
| 
AbstractDetail (SINGLE_TABLE_PER_CLASS strategy with discriminator colum ou TABLE_PER_CLASS) implements DetailItf 
| 
|-B inherits from Details 
|-C inherits from Details 

,那麼你必須使用一個AbstractDetail類的基類,如:

@LazyCollection(LazyCollectionOption.FALSE) 
@OneToMany(targetEntity=foo.pck.AbstractDetail.class) 
private List<DetailsItf> details = new ArrayList<DetailItf>(); 

和使用情況,您應該做一個

B myB = new B(); 
// saving myB entity 
A myA = new A(); 
myA.addDetails(myB); 
// saving myA 

您還應該根據TYPE()JPQL特定的關鍵字執行特定的查詢,或者在使用jpql中的FROM CLASS但您必須創建概念驗證並驗證性能。

+0

我編輯我的問題更準確 – oak

+0

謝謝!我會試試看 – oak

相關問題