[英]How to join 2 tables with different column name in spring tool suite with JPA?
[英]Jpa - join different tables depend by column type
我有一個問題,我不確定它可能與jpa
如果我讓表A表示
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:
一種可能的解決方案可能是某種使用getter的hack。 這意味着:在A中映射所有可能的連接(將它們標記為惰性)並創建一個getter,它將知道依賴於它應該使用的連接類型。
我想你想要從A類繼承B和C類的實例中添加一些細節。 我建議你閱讀有關繼承和鑒別器值/列的文檔。
在hibernate的文檔中,您將看到如何 - 使用繼承的概念和TABLE_PER_CLASS策略 - 並描述descriminator列(您的類型列)
編輯:但我建議您使用另一種策略,如SINGLE_TABLE_PER_CLASS。 請注意,JPA提供程序不必支持TABLE_PER_CLASS策略,而且,此特定的startegy會對性能產生影響。
* 第二次編輯:*好的:我建議你使用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
然后你必須在你的基類A類中使用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但是您必須創建概念證明並驗證性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.