【发布时间】: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