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

标签 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 进行某种破解。意思是: 映射 A 中所有可能的连接(将它们标记为惰性连接)并创建一个 getter,它会根据类型知道应该使用哪个连接。

最佳答案

我猜您想向 A 实例添加一些详细信息,并从 A 类继承 B 和 C 类。 我建议您阅读有关继承和鉴别器值/列的文档。

关于 hibernate 的文档你会看到如何 - 使用继承的概念和TABLE_PER_CLASS策略 - 并描述鉴别器列(您的类型列)

编辑:但我建议您使用其他策略,例如 SINGLE_TABLE_PER_CLASS。请注意,JPA 提供程序不必支持 TABLE_PER_CLASS 策略,而且这种特定策略会对性能产生影响。

*第二次编辑:* 好的:我建议您对 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 进行特定查询,但您必须创建概念证明并验证性能。

关于java - Jpa - 根据列类型连接不同的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21408218/

相关文章:

java - 请澄清下面java代码中的问题

Java for 循环[方法]

java - 使用 Hibernate @Column 注释而不使用 getter 和 setters 方法声明

java - JPA 2.0 Provider Hibernate 3.6 for DB2 v9.5 type 2 驱动程序在配置准备中抛出异常

java - 设备上的 Lollipop 更新后 Android GCM 无法工作

java - java中可以删除数组的索引吗?

java - Spring JPA 连接两个表,无需第三类

java - Spring data jpa - 更新父级时,如何从数据库中删除与其关联的子级(基于id)并添加新的子级

java - 检查数据库中重复记录的最佳方法| hibernate

hibernate - 合并并获取未刷新的待更新版本?