在事务中两次持久保存同一实体时出错

时间:2015-10-15 09:11:57

标签: java mysql hibernate jpa entitymanager

考虑数据库中存在的实体。 事务中发生以下操作 -

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

有人能告诉我如何在没有错误的情况下达到预期的效果吗?

1 个答案:

答案 0 :(得分:1)

您是否在实体中使用带有日期/时间戳的@Version注释? 我过去遇到过类似的情况。尝试使用@Version列更新实体时进行休眠,包括@Version列以及更新语句中的主键。

hibernate docs提到了这个 -

  

使用java.util.Date时,而不是long / Long进行修订   时间戳,注意不要将它存储到将要的列数据类型   松散的精度。

这导致第二个更新语句没有获取所需的行,因此导致意外的行计数异常。

在没有@Version注释或整数/长版本的情况下尝试。