2

下面是表结构

在此处输入图像描述

公式

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

50=50+0 ID(1)

200=150+50 ID(2)

关于第二行,我们如何使用 hibernate session.save() 更新余额;我试图写出插入查询,但知道 HQL 不支持插入值但从其他表中选择。

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

如果使用hibernate, I first get the balance of max id of customer 1and then 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 有公告功能来控制这种情况吗?

我们如何使用具有最新余额的休眠 session.save() 保存交易。?

让我知道 !

4

1 回答 1

0

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

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

@Generated(value = GenerationTime.ALWAYS)

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

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

解决方案2:不要使用用户事务来提交多用户依赖数据。

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

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

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

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

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

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

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

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

于 2013-09-03T16:50:54.547 回答