Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JPA Hibernate忽略脏检查中的某些实体属性更改?_Hibernate_Jpa_Hibernate Mapping - Fatal编程技术网

如何使用JPA Hibernate忽略脏检查中的某些实体属性更改?

如何使用JPA Hibernate忽略脏检查中的某些实体属性更改?,hibernate,jpa,hibernate-mapping,Hibernate,Jpa,Hibernate Mapping,我在我的项目中使用JPA2.1和Hibernate 5.1,我有一个模块,其中我只使用JPA注释创建实体。我不能让它依赖于hibernate注释 在本模块中,我有一个实体具有以下属性声明: @javax.persistence.Column(name = "lastModified", unique = false, nullable = false, insertable = true, updatable = true) @Temporal(value = Tempora

我在我的项目中使用JPA2.1和Hibernate 5.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(entity)
,以便加载实体并对其进行管理。我没有对我的实体进行任何更改,但Hibernate dirty check检测到lastModified属性为null,它正在对此进行更新查询,最后字段版本将递增。
另外,如果我用日期(等于数据库中的值)设置属性
lastmedited
,脏检查会检测到此字段上的更改并进行更新查询,因为它会将其与作为时间戳的
loadedState
进行比较

我想让Hibernate dirty check忽略此字段lastModified,我找到了注释
@OptimisticLock(excluded=true)
,但这是Hibernate注释,我无法在模块中使用它进行其他约束

你有什么建议吗

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

为什么不简单地加载实体 使用
EntityManager#查找
?近似

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
问题是:当我创建实体的一个新实例时,我设置了一个存在于数据库中的id值,我调用entitymanager.merge(实体),以便加载实体并对其进行管理

为什么不简单地加载实体 使用
EntityManager#查找
?近似

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

因为它是一个rest Web服务,我有一个特定的解析器来解析json数据,并使用reflectionSure创建一个新的实体实例,如果你想重新发明轮子,而不是花时间研究JPA,那么我的解决方案就帮不上忙了:-)这不是我想要的,我只是在这个项目中面临很多限制,我正在寻找最好的替代方案。无论如何,谢谢:-)因为这是一个rest Web服务,我有一个特定的解析器,它解析json数据,并使用reflectionSure创建一个新的实体实例,如果你想重新发明轮子,而不是花时间在JPA上,那么我的解决方案将不会有帮助:-)这不是我想要的,我只是在这个项目中面临很多限制,我正在寻找最好的替代方案。无论如何,谢谢:-)合并后,您可能对实体做什么?不保存更改?如果不修改、持久化和增加版本,为什么需要管理它?当然,我必须在合并后保存它,但是当我收到一个json,其中没有对数据存储中的状态进行修改时,为什么会生成更新请求并增加版本字段?这就是我的问题,这就是为什么我试图忽略hibernate dirty Check中的lastModified属性合并后,您可能会对实体做什么?不保存更改?如果不修改、持久化和增加版本,为什么需要管理它?当然,我必须在合并后保存它,但是当我收到一个json,其中没有对数据存储中的状态进行修改时,为什么会生成更新请求并增加版本字段?这就是我的问题,这就是为什么我试图忽略hibernate脏检查中lastModified属性的原因