【问题标题】:How to ignore some entity attributes changes on dirty check with JPA Hibernate?如何在使用 JPA Hibernate 进行脏检查时忽略某些实体属性更改?
【发布时间】: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


【解决方案1】:

问题是:当我创建实体的新实例时,我设置了一个存在于数据库中的 id 值,我调用 entitymanager.merge(entity) 以便加载实体并成为托管实体。

您不只是加载实体的任何原因 使用EntityManager#find?类似于

final int id = 42; // coming from a request or else, assuming your ID is of type int of course
final PersistentObject po = entityManager.find(PersistentObject.class, id);
// Further use of po

【讨论】:

  • 因为它是一个休息网络服务,我有一个特定的解析器,它正在解析 json 数据并使用反射创建一个新的实体实例
  • 当然,如果你想重新发明轮子,宁愿花时间在 JPA 上工作,那么我的解决方案将无济于事 :-)
  • 这不是我想要的,我只是在这个项目中面临很多限制,我正在寻找最好的选择。无论如何谢谢:-)
猜你喜欢
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
相关资源
最近更新 更多