您无法在Hibernate Criteria中的托管事务期间提交

时间:2015-07-08 08:18:12

标签: java database hibernate transactions criteria

美好的一天,

以下是我的原始代码:

Criteria criteria = getSession( ).createCriteria(
                JSNumber.class );
criteria.add( Restrictions.eq( "paymentDate", mnight ) );
JSNumber result = (JSNumber) criteria
                .uniqueResult( );

int newNo = result.getRunningNo( ) + 1;
result.setRunningNo( newNo );
getSession( ).merge( result );
getSession( ).flush( );

这是从JSNumber表中获取运行编号。假设数字为12,然后+ 1变为13,然后在数据库中将运行数字改为13。

有一个错误,当时间几乎相同时,只是在毫秒内,两个请求从/向此表获取结果/更新,它可能会为两个用户请求返回相同的结果。

例如,第一次请求在14:47:36.735,第二次请求在14:47:36.737第一次请求获取值= 110,它将更新为111.但在第一次请求更新值之前,第二次请求已经获得价值,也是110。

我正在尝试使用beginTransaction()来处理此案例。以下是我的新代码:

Transaction tx = null;
tx = getSession().beginTransaction( );

Criteria criteria = getSession( ).createCriteria(
                JSNumber.class );
criteria.add( Restrictions.eq( "paymentDate", mnight ) );
JSNumber result = (JSNumber) criteria
                .uniqueResult( );

int newNo = result.getRunningNo( ) + 1;
result.setRunningNo( newNo );
getSession( ).merge( result );
getSession( ).flush( );

tx.commit( );

这将会点击java.sql.SQLException: You cannot commit during a managed transaction!

我是Hibernate的新手。请告知我犯的错误。我试着长时间谷歌,但看起来无法找到我理解的方式。

1 个答案:

答案 0 :(得分:0)

您的交易有可能发生  正在由休眠的其他人(最有可能是容器)管理 这就是例外情况 在这些托管环境的情况下,Hibernate无法自行处理Transaction。 由该受管环境完成的事务处理(开始,提交或回滚数据库事务)。

请阅读transactions-demarcation以清楚了解原因