jpa并发CMT异常处理

时间:2011-11-16 10:41:51

标签: jpa concurrency

我使用EntityManager在数据库中保存/更新我的实体,使用Hibernate作为jpa提供程序。我的交易由容器处理。

问题:我需要添加一个可能已存储在数据库中的实体,因此会抛出异常。在这种情况下,我需要重复插入,但有另一个值。但只要抛出异常,会话就会变坏,我需要创建一个新会话并回滚事务。我在使用CMT时该怎么做?或者,如果还有其他方法可以做到这一点?

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用TransactionAttribute(REQUIRES_NEW)作为持久性方法。如果调用您的方法的bean将捕获异常,它可能会进行一些更改并再次调用该方法 这将仅回滚持久性方法事务 - 而不是调用bean。

但请记住,如果您的用例不要求您执行EntityManager#persistence(-),则可能对EntityManager#merge(-)操作感兴趣。如果实体尚不存在,它将持久;如果实体已经存在,则更新(根据PK检查存在)。

HTH。

答案 1 :(得分:0)

您可能希望使用EntityManager#find(Class,PK)来检查已经存在的实体。 null结果意味着没有这样的实体(----> persist(。)),否则你用merge(。)方法更新。