【发布时间】:2021-02-09 21:38:09
【问题描述】:
我在我的项目中使用 JPA 2.1 和 Hibernate 5.1,我有一个模块,我在其中只使用 JPA 注释创建我的实体。我不能让它依赖于休眠注释
在这个模块中,我有一个具有此属性声明的实体:
@javax.persistence.Column(name = "lastModified", unique = false, nullable = false, insertable = true, updatable = true)
@Temporal(value = TemporalType.TIMESTAMP)
@Basic(fetch = FetchType.EAGER, optional = false)
private java.util.Date lastModified = null;
@javax.persistence.Column(name = "version", unique = false, nullable = false, insertable = true, updatable = true)
@Basic(fetch = FetchType.EAGER, optional = false)
@Version
private Long version = null;
这样,当 Hibernate 持久化或加载我的实体时,lastModified 的类型将更改为 java.sql.Timestamp。
问题是:
当我创建我的实体的新实例时,我设置了一个存在于数据库中的 id 值,我调用entitymanager.merge(entity) 以便该实体将被加载并成为托管实体。我没有对我的实体进行任何更改,但 Hibernate 脏检查正在检测属性 lastModified 为空,它正在为此进行更新查询,最后字段版本增加。
此外,如果我将属性 lastModified 的值设置为日期(等于数据库中的值),脏检查会检测到该字段的更改并进行更新查询,因为它将它与 @ 进行比较987654326@ 这是一个时间戳
我想要的是让 Hibernate 脏检查忽略这个字段 lastModified,我找到了注释 @OptimisticLock(excluded = true) 但这是 Hibernate 注释,我不能在我的模块中将它用于其他约束
请问您有什么建议吗?
【问题讨论】:
-
合并后,你可能对实体做什么?不保存更改?不修改、不持久化、不增加版本,为什么还要管理?
-
当然我必须在合并后保存它,但是当我收到一个不包含对数据存储中的状态进行修改的json时,为什么会生成更新请求并且版本字段会增加?这是我的问题,这就是为什么我试图忽略休眠脏检查中的 lastModified 属性
标签: hibernate jpa hibernate-mapping