微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 eclipselink 中 OneToOne join fetch 中未返回主键

如何解决在 eclipselink 中 OneToOne join fetch 中未返回主键

在同一个类中存在 OnetoOne 关系的情况下,我在获取连接时遇到问题。示例如下:

class Data {
 ...

 @Id
 @Column(name = "DATA_ID")
 Long id;

 @Column(name = "DATA_OWNER_ID")
 @ForeignKey(entityClass = Owner.class)
 Long ownerId;

 @Column(name = "DATA_RELATED_ID")
 @ForeignKey(entityClass = Data.class)
 Long relatedDataId;

 @OnetoOne(fetch = FetchType.LAZY)
 @JoinColumn(name = "DATA_RELATED_ID",referencedColumnName = "DATA_ID",insertable = false,updatable = false)
Data relatedData;

}

我想根据某些条件选择数据,同时获取/初始化“relatedData”,所有这些都在一个 JPQL 查询中:

SELECT owner.something1,data
FROM Data data
JOIN Owner owner on data.ownerId = owner.id
JOIN FETCH data.relatedData
WHERE data.something2 = :expectedSomething2

执行该 JPQL 查询会引发异常:

Query: ReadobjectQuery(name="relatedData" referenceClass=Data)|Exception:
javax.persistence.PersistenceException: Exception [EclipseLink-6044] (Eclipse Persistence Services - 2.6.2.v20151217-774c696): org.eclipse.persistence.exceptions.QueryException
Exception Description: The primary key read from the row [DatabaseRecord(
DATA_X => something
DATA_Y => something2
...
)] during the execution of the query was detected to be null.  Primary keys must not contain null.

这有点正确,因为没有列出 DATA_ID 列。将 JOIN FETCH 更改为 LEFT JOIN FETCH 会返回 owner.something1data,但 relatedData 对象为 null(relatedDataId 不为 null)。

我可以看到,relatedData 的 id 是从 DB 返回的,但是 eclipselink 在 valueFromrowInternalWithJoin 和 trimRowForJoin 方法中对其进行了修剪。

解决方法

Id 列名称属性值 是此异常的原因。在 eclipselink version 2.3.2 中发现了同样的问题,但它在 version 2.0.0 中工作正常 试试这个条目:

eclipselink.jpa.uppercase-column-names=true

OR尝试大小写一一,这对您有用。

@Id
@Column(name = "UUID")   // UUID - uppercase/lowercase one by one
Long id;
,

我已经以某种方式解决了这个问题,但没有时间正确确定原因。最终(工作)版本差异是:

  1. 我可能忘记为 relatedData 添加 get/set
  2. 我在 targetEntity = Data.class 中指定了 @OneToOne
  3. Fetch 现在是 LEFT JOIN FETCH 并出现在 JOIN Owner owner 之前

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。