当前位置: 首页 > 知识库问答 >
问题:

如何在dirty check中忽略JPA Hibernate中的实体属性变化?

梁丘经艺
2023-03-14

我在我的项目中使用了JPA2.1和Hibernate5.1,我有一个模块,在这个模块中我只使用JPA注释创建我的实体。我不能让它依赖于hibernate注释

@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(实体),这样实体将被加载并被管理。我没有对我的实体做任何更改,但Hibernate dirty check检测到属性lastModified为空,并对其进行更新查询,最后字段版本会递增。
此外,如果我用日期(等于数据库中的值)设置属性lastModified的值,则dirty check检测到该字段的更改并进行更新查询,因为它将该字段与时间戳LoadedState进行比较

我想要的是使Hibernate dirty-check忽略这个字段lastModified,我找到了注释@optimisticLock(excluded=true),但这是Hibernate注释,我不能在模块中使用它来处理其他约束

你有什么建议吗?

共有1个答案

东郭翰音
2023-03-14

问题是:当我创建一个实体的新实例时,我设置了一个存在于数据库中的id值,我调用EntityManager.merge(entity)以便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对象缺少属性“ age”, 有人说它不能反序列化。在反序列化期间是否有 注释 可以忽略丢失的字段? 谢谢 问题答案: 我想你想要的是 这就是Jackson 1.x的方式。我认为2.x中有一种新方法。就像是 这些将告诉Jackson仅序列化不为null的值,并且在反序列化缺少的值时不会抱怨。我认为它将只是将其设置为Java默认值。

  • 我们希望能够将未映射的SourcePolicy设置为ReportingPolicy. ERROR,以便默认情况下丢失的源会大声失败。但是,有时源对象模型包含与目标无关的内容。因此,我们希望能够执行以下操作: 可以对目标执行类似操作。如果我尝试上述操作,我会得到错误,因为映射中需要目标。

  • 是否有可能不在HiberNate中的实体层次结构中间为类创建表? 我想指出某些实体是某种类型的子集,以便返回所有这些实体的集合,但我不会在此中间类型中放置任何额外的属性。因此,保留带有id字段的额外表只是为了连接表,这听起来并不好。 更好的解决方案是实现一些公共接口< code>CommonInterface,但是这样我就失去了返回< code>List的可能性

  • 问题内容: 我在GlassFish 4上使用java.util.logging。 我正在定义自己的类,以通过定义System属性 来初始化。 我的班级加载文件,将其与其他属性文件合并,并进行一些自定义替换。 以下是我文件的相关部分: 我正在使用标准并将其配置为使用格式化程序。 但是字符串被完全忽略了。相反,SimpleFormatter使用其默认格式。 我哪里做错了? 问题答案: 我假设系统属性是

  • 问题内容: 我有一个对象,该对象正在使用ServiceStack.Text命名空间中的方法进行反序列化。 如何在序列化过程中忽略所有唯一属性?有没有类似属性或可以用来装饰属性的东西,可以将其省略? 谢谢 问题答案: ServiceStack的文本序列化程序遵循.NET的DataContract序列化程序行为,这意味着您可以使用opt- out 属性忽略数据成员 选择加入的方法是装饰要序列化的每个属