Jpa - 根据列类型连接不同的表

时间:2014-01-28 14:25:02

标签: java jpa jpa-2.0 spring-data

我有一个问题,我不确定它可能与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,它将知道依赖于它应该使用的连接类型..

1 个答案:

答案 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但是您必须创建概念验证并验证性能。