当前位置: 首页 > 面试题库 >

休眠幂等更新

韩乐湛
2023-03-14
问题内容

我试着通过网络搜索,但是徒劳。有没有一种方法可以使用hibernate来执行幂等更新。

一种用例是使用HTTP PUT通过REST API更新数据库中的特定字段。因此,例如,如果我有一个包含列: _ Id,Name,Phone,UpdateDate*_ 的数据库 _ _ 并且我多次用相同的值更新(特定 ID的
Phone电话) 字段,那么只有我的第一个操作必须更新 Phone (并更改我的 UpdateDate
)。后续更新必须对记录(和 UpdateDate )无效。

***

虽然这可以在应用程序中实现,方法是先获取记录并将其与我的输入值进行比较,然后再执行更新。 我想知道Hibernate是否具有任何内置功能?


问题答案:

在hibernate状态下,如果您有一个对象并尝试修改其属性之一并提交事务。Hibernate将新值与旧值进行比较。 仅当至少一个属性的新值与旧值不同时
,才对实体的所有持久性属性发出UPDATE

例:

  1. 通过ID查找EntityA。Hibernate对该实体(以及任何非延迟的多对一实体)发出SELECT指令,并记住原始值。EntityA a = hibernateSession.find(EntityA.class, id);
  2. 在entityA上设置一些属性。 a.setPhone(newPhoneValue);
  3. 提交事务,触发hibernateSession.flush().Hibernate将新值与旧值进行比较。如果propertyB的旧值和新值不同,则对x的所有持久性属性发出UPDATE。

发出如下更新: UPDATE entityA set phone=?, name=?, updateDate=? WHERE id=?

如果需要,可以在映射中使用dynamic-
update和dynamic-
insert。

动态更新(可选-默认为false):指定应在运行时生成UPDATE SQL,并且只能包含其值已更改的列。

动态插入(可选-默认为false):指定应在运行时生成INSERT SQL,并且仅包含其值不为null的列。

将dynamic-update设置为true时,hibernate将发出UPDATE不包含该name列的a ,因为它没有更改。

UPDATE entityA set phone=?, updateDate=? WHERE id=?



 类似资料:
  • 问题内容: 据我了解(如果我错了,请纠正我),Hibernate使用对象引用来检查对象的相等性。当Hibernate识别同一数据库记录中有多个对象附加时,它将引发以下异常。 我的问题是,Hibernate是否使用方法检查对象是否相等(默认的equal方法使用对象引用)?如果为true,则重写的方法会改变Hibernate的行为吗? 注意:我的问题不是关于Hibernate持久对象中的实现或方法问题

  • 问题内容: 我在Java J2EE Web应用程序中使用Hibernate 3.5.2和Spring Core 3.0.1。当单独的用户同时更新同一记录时,我得到了StaleObjectStateExcpetion。事务由javax.persistence.EntityManager管理。这是我创建问题的步骤。 User1登录到应用程序 User2登录到应用程序 用户1开始编辑记录A 用户2开始编

  • 问题内容: 我有一个hibernate映射,该映射一直工作到最近-尽管我确定这是我所做的某些更改的结果,但我似乎找不到它。 映射文件将字段定义为: 该类将该字段定义为: 运行此代码时,出现以下错误: 与此对应的数据库字段定义为: 我还有其他几个具有相似结构和定义的类,并且它们没有问题。但是,可能由于我最近所做的一些更改而导致,此特定映射将不再正常工作。 有什么建议么? 问题答案: 我不确定,但是您

  • 问题内容: 我收到了一个我无法解释的奇怪的Hibernate异常。告诉我我正在使用二级缓存,但是没有在哪里指定二级缓存。这是例外: 而我的: 有什么想法会触发此异常吗?提前致谢! 问题答案: Pau在hibernate.cfg.xml中写了hibernate.cache.region.factory_class: 唯一的例外是不言而喻的。您必须设置 属性。例如,使用ehcache将添加以下行: n

  • 问题内容: 有人可以透视一下JPA和Hibernate之间的区别吗?还是将这些互补的概念一起使用? 问题答案: 大致来说,JPA是java社区的一个标准,这里是specs,它是由Hibernate家伙实现(并扩展)的(此处提供一些信息)。作为规范,您将不会直接使用JPA,而是使用JPA实现。 请注意,如果要使用hibernateJPA扩展,将破坏与其他JPA实现的兼容性(尽管有些人会说“为什么要使

  • 问题内容: 我知道,如果没有其他具有相同ID和类型的对象附加到会话中,则使用update会将分离的对象置于持久状态。合并不关心状态。如果会话中不存在相同类型的持久对象,或者它使用新对象的值更新旧对象,则它只会返回该对象。我的问题是关于数据库命中的问题。方法“更新”和“合并”是否立即击中数据库?或关闭会话后,数据库中的更改显而易见。 编辑:如果我们通过save方法在持久化实例上调用update方法会