我使用EntityManager在数据库中保存/更新我的实体,使用Hibernate作为jpa提供程序。我的交易由容器处理。
问题:我需要添加一个可能已存储在数据库中的实体,因此会抛出异常。在这种情况下,我需要重复插入,但有另一个值。但只要抛出异常,会话就会变坏,我需要创建一个新会话并回滚事务。我在使用CMT时该怎么做?或者,如果还有其他方法可以做到这一点?
谢谢。
答案 0 :(得分:1)
您可以使用TransactionAttribute(REQUIRES_NEW)
作为持久性方法。如果调用您的方法的bean将捕获异常,它可能会进行一些更改并再次调用该方法
这将仅回滚持久性方法事务 - 而不是调用bean。
但请记住,如果您的用例不要求您执行EntityManager#persistence(-)
,则可能对EntityManager#merge(-)
操作感兴趣。如果实体尚不存在,它将持久;如果实体已经存在,则更新(根据PK检查存在)。
HTH。
答案 1 :(得分:0)
您可能希望使用EntityManager#find(Class,PK)来检查已经存在的实体。 null结果意味着没有这样的实体(----> persist(。)),否则你用merge(。)方法更新。