[英]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.