考虑数据库中存在的实体。 事务中发生以下操作 -
mainfuntion()
{
transaction.begin();
function1();
if(check some business logic )
{
function2()
}
transaction.commit()
}
function1()
{
query1 - returns Entity
modify Entity;
EntityManager.persist(Entity)
}
function2()
{
query1 - returns Entity
modify Entity
EntityManager.persist(Entity)
}
现在发生的两个修改在逻辑上是有意义的,因此我不想进行两个修改。我也不想在两种方法之间传递实体。
在提交时,我得到以下异常 -
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
有人能告诉我如何在没有错误的情况下达到预期的效果吗?
答案 0 :(得分:1)
您是否在实体中使用带有日期/时间戳的@Version
注释?
我过去遇到过类似的情况。尝试使用@Version
列更新实体时进行休眠,包括@Version
列以及更新语句中的主键。
hibernate docs提到了这个 -
使用java.util.Date时,而不是long / Long进行修订 时间戳,注意不要将它存储到将要的列数据类型 松散的精度。
这导致第二个更新语句没有获取所需的行,因此导致意外的行计数异常。
在没有@Version
注释或整数/长版本的情况下尝试。