繁体   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