Hibernate 幂等更新

发布于 2024-12-01 19:03:44 字数 365 浏览 0 评论 0 原文

我尝试在网上搜索此内容,但没有成功。有没有办法使用hibernate来执行幂等更新。

一种用例是使用 HTTP PUT 通过 REST API 更新数据库中的特定字段。例如,如果我有一个包含以下列的数据库:Id、Name、Phone、UpdateDate 并且我更新了Phone 字段(特定的Id)多次使用相同的值,只有我的第一个操作必须更新电话(并且还更改我的UpdateDate)。后续更新不得对记录(和 UpdateDate)产生影响。

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

I tried searching this over the net but in vain. Is there a way to use hibernate to perform an idempotent update.

One use case is to use HTTP PUT to update a specific field in the database via a REST API. So for example, if I have a database with columns : Id, Name, Phone, UpdateDate and I update the Phone field (of a specific Id) with the same value multiple times only my first action must update the Phone(and also change my UpdateDate). Subsequent updates must have no effect on the record (and UpdateDate).

While this can be implemented in an application by first getting the record and comparing it against my input value before performing an update. I was wondering whether Hibernate has any inbuilt features?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我纯我任性 2024-12-08 19:03:44

在休眠中,如果您获取一个对象并尝试修改它的其中一个属性并提交事务。 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。

发出如下更新: UPDATEEntityA setphone=?, name=?, updateDate=? WHERE id=?

如果您愿意,可以使用 动态更新动态插入映射。

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

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

将dynamic-update设置为true时,hibernate将发出一个不带name列的UPDATE,因为它没有改变。

更新实体A设置电话=?,更新日期=?哪里 id=?

In hibernate if you get an object and try to modify one of it`s property and commit the transaction. Hibernate compares new values to the old values. Issues an UPDATE for all persistent properties of the entity only if the new value of at least one of the property is different than the old value.

Example:

  1. Find EntityA by id. Hibernate issues a SELECT for the entity (and any non-lazy many-to-one entities), and it remembers the original values. EntityA a = hibernateSession.find(EntityA.class, id);
  2. Set some property on entityA. a.setPhone(newPhoneValue);
  3. Commits the transaction, triggering hibernateSession.flush(). Hibernate compares new values to the old values. Issues an UPDATE for all persistent properties of x if the old and the new value of propertyB are different.

Issue an update like : UPDATE entityA set phone=?, name=?, updateDate=? WHERE id=?

If you want you can use dynamic-update and dynamic-insert in the mapping.

dynamic-update (optional - defaults to false): specifies that UPDATE
SQL should be generated at runtime and can contain only those columns
whose values have changed.

dynamic-insert (optional - defaults to false): specifies that INSERT
SQL should be generated at runtime and contain only the columns whose
values are not null.

With dynamic-update set to true hibernate will issue a UPDATE without the name column because it has not change.

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文