在多用户环境中使用休眠更新运行平衡

Posted

技术标签:

【中文标题】在多用户环境中使用休眠更新运行平衡【英文标题】:update running balance using hibernate in multiuser environment 【发布时间】:2013-08-27 09:28:00 【问题描述】:

以下是表结构

公式

余额 = 原始金额 + 余额(以前)

50=50+0 ID(1)

200=150+50 ID(2)

关于第二行,我们如何使用休眠更新余额但从其他表中选择。

In HQL, only the INSERT INTO … SELECT … is supported; there is no INSERT INTO … VALUES. HQL only support insert from another table. [source]

如果使用休眠,I first get the balance of max id of customer 1then pass the balance to the new object 就可以了!

但在多用户环境中,为one user get the balance of max id of customer 1,同时other user insert the new row and update the balance。那么第一个获得余额的用户是老because when first user transaction geting the balance other user insert new row and update balance。在这种情况下,第一个用户交易相对于他在更新第二个用户交易之前获得的先前余额插入了错误的余额。

hibernate 有公告功能来控制这种情况吗?

我们如何使用 hibernate session.save() 以最新余额保存交易。 ?

更新我!

【问题讨论】:

hibernate应该如何知道第2行对第1行的依赖关系? 【参考方案1】:

由于表示表行的实体是相互独立的,所以hibernate无法知道余额的计算是基于过时的数据。

解决方案1(到目前为止我最喜欢的一个):计算数据库中的余额(使用触发器)并将余额属性标记为

@Generated(value = GenerationTime.ALWAYS)

以便实体在写入后更新。 Hibernate 和数据库将负责其余的工作。

如果您必须在应用程序级别进行余额计算,您会想到多种解决方案,但存在一些缺点:

解决方案 2:不要使用用户事务提交多用户相关数据。

创建一些东西(例如一些排队机制)来序列化保存请求。在独立于用户的事务中进行处理。

缺点:用户看不到余额,因为它存储在数据库中(但您可能会在当前计算中显示一个暂时的“预测余额”),并且您有一个更复杂的应用程序逻辑和一个通过序列化的瓶颈.

解决方案 3:写入(可能)错误数据(或将其留空)- 之后更新

如果您将用于计算的实体的 ID 与新实体一起存储,则可以检查重复项(两个实体的余额基于同一实体)并更新该值。

缺点:类似于解决方案 2,但没有瓶颈,因为更新可以在后台任务中完成。

解决方案 4:重构数据模型以消除实体之间的依赖关系(用于写入)。

您可以使天平瞬态(如果您必须显示或使用它,请计算它)。

缺点:仅适用于中等数量的条目,并从数据库中删除此数据,这可能会妨碍您可能想要执行的某些查询

【讨论】:

以上是关于在多用户环境中使用休眠更新运行平衡的主要内容,如果未能解决你的问题,请参考以下文章

如何在多对多关系中更新日期

iPhone:在多线程环境中发布 UIViewController 时出现问题

在多账户 AWS 环境中,我将如何在 IAM 用户登录时强制他/她承担角色?

如何在多对多关系上使用休眠和 JPA 删除孤立实体?

在多线程环境中更新 DataGrid 视图

如何在多用户 MacOS Sierra 设置中使用 Homebrew