我有一个问题,我不确定它可能与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的黑客攻击。意思是: 映射在一个所有可能的连接(将它们标记为惰性)并创建一个getter,它将知道依赖于它应该使用的连接类型..
答案 0 :(得分:2)
我想你想要从A类继承B和C类的A实例中添加一些细节。 我建议你阅读有关继承和鉴别器值/列的文档。
在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但是您必须创建概念验证并验证性能。