2015-10-15 73 views
1

考虑一个存在于数据库中的实体。 一个事务中发生下列操作 -在事务中两次保持同一个实体的错误

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

在函数2中,合并实体并且不再坚持它 –

+0

试过,如果已经存在于持久性上下文中,则将其合并。不起作用。 :( – akshay202

+0

@LaurentiuL。 – akshay202

回答

1

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

休眠文档提到这一点 -

当使用java.util.Date,而不是长/长为修订 时间戳,注意不要将其存储到列数据类型这将 松散的精度。

这会导致第二个更新语句不会获取所需的行,从而导致意外的行计数异常。

尝试使用不带@Version注释或整数/长整数版本。

相关问题