簡體   English   中英

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.

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