【问题标题】:JPA (EclipseLink) SecondaryTable erroneous join with java 1.7JPA(EclipseLink)SecondaryTable 与 java 1.7 的错误连接
【发布时间】:2018-11-21 09:09:26
【问题描述】:

我创建了一个实体,使用 SecondaryTable 注释将客户表与客户详细信息表连接

@Entity
@Table(name="CUSTOMER")
@SecondaryTable(name="CUST_DETAIL", 
            pkJoinColumns=@PrimaryKeyJoinColumn(name="CUST_DETAIL_ID", referencedColumnName = "CUST_DETAIL_ID"))
public class Customer {
    @Id
    @Column(name = "CUST_ID")
    private Long id;

    @Column(name = "CUST_DETAIL_ID")
    private Long custDetailPk;

    @Column(name = "CUST_DETAIL_ID", table = "CUST_DETAIL")
    private Long custDetailId;

    ...
} 

它正在使用 java 1.6,生成的查询就像

SELECT t0.CUST_ID, t0.CUST_DETAIL_ID, t1.CUST_DETAIL_ID, ... FROM CUSTOMER t0, CUST_DETAIL t1 WHERE t1.CUST_DETAIL_ID = t0.CUST_DETAIL_ID

但是当我迁移到 java 1.7 时,生成的查询接缝错误

SELECT t0.CUST_ID, t1.CUST_DETAIL_ID, t0.CUST_DETAIL_ID, ... FROM CUSTOMER t0, CUST_DETAIL t1 WHERE t1.CUST_DETAIL_ID = t1.CUST_DETAIL_ID

并返回多行。

jpa secondarytable和java 1.7有什么问题吗?

【问题讨论】:

  • 你还在用同一个版本的Hibernate吗?
  • 你的意思是,你还在用同一个版本的EclipseLink吗……
  • 是的,我使用的是相同版本的 EclipseLink。我已经尝试了几个新版本,结果相同。
  • 为什么同一个字段 (CUST_DETAIL.CUST_DETAIL_ID) 映射了两次? custDetailId 不应存在或作为主键的一部分进行注释,因为它不是 - 该字段是通过 SecondaryTable 映射从 custDetailfk 值设置的。我不知道为什么 JVM 处理存在差异,但我怀疑有多个映射以不同的顺序进行处理,因此额外的映射被用于查询中的 equals 检查,而不是主表。
  • 当 CUST_DETAIL_ID 的唯一性足以用于强制性 CUST_DETAIL 行时,为什么 CUST_DETAIL_ID 和 CUST_ID 都是 CUSTOMER 的 ID,这也没有任何意义。不只是 CUST_DETAIL_ID 可用于 ID,还是应该 CUST_ID == CUST_DETAIL_ID?如果他们不这样做,那么 CUST_DETAIL 表似乎应该被视为具有 1:1 关系的自己的实体类

标签: java jpa eclipselink


【解决方案1】:

解决办法是避免CUST_DETAIL_ID字段名称引起的混淆,JPA需要知道属于哪个表,属性名称custDetailId和custDetailPk 必须按字母顺序排列。

@Entity
@Table(name="CUSTOMER")
@SecondaryTable(name="CUST_DETAIL", 
            pkJoinColumns=@PrimaryKeyJoinColumn(name="CUST_DETAIL_ID", referencedColumnName = "CUST_DETAIL_ID"))
public class Customer {
    @Id
    @Column(name = "CUST_ID")
    private Long id;

    @Column(name = "CUST_DETAIL_ID", table = "CUSTOMER")
    private Long custDetailId;

    @Column(name = "CUST_DETAIL_ID", table = "CUST_DETAIL")
    private Long custDetailPk;

    ...
} 

【讨论】:

    猜你喜欢
    • 2018-06-08
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多