使用 Hibernate JPA 和 Spring @Transactional
(使用 Atomikos JTA 实现)我的系统中有以下实体:
- 订单
- 订单行(保存对订单的引用)
- 客户
在用 @Transactional
注释的 Service 类方法 addOrder
中,我想在一个事务中执行以下步骤(它是一个原子功能 block )。
- 坚持命令
- 遵守命令
- 留住客户
在第 1 步(保留顺序)我希望 JPA 在出现任何异常
时回滚。
在第 2 步(保留顺序行)我想忽略保留顺序行期间的任何错误。因此,如果我有 10 个订单行,其中 1 个因任何原因(例如违反约束)而失败,我想继续处理其他订单行。
在步骤 3 如果出现任何异常
,我希望 JPA 回滚整个事务,以及在步骤 1 和 2 中完成的所有操作。
到目前为止我遇到的问题:
- JPA 在发生
异常
时将事务标记为“仅回滚”。因此,此操作之后(和之前)的所有内容都会回滚,但我想忽略第 2 步中的Exception
。 - JPA 仅在调用
flush()
或commit()
后才知道约束违规,这通常是在@Transactional
方法完成之后。我需要在我的方法中知道它。 - 尝试将每个步骤拆分为单独的
@Transactional
方法,但由于它们需要使用相同的Transaction
,这不会改变前两个问题。
最好的方法是什么?
更新
我是否应该将所有验证放在 Java 中并手动检查记录是否已存在,例如?
最佳答案
将第二部分放入 try-catch
block 中。例如:方法主体可能如下所示。
save(order);
flush();
for(Orderline line : orderlines) {
try {
orderlineService.save(line);
flush();
} catch(RuntimeException rte) {
continue;
}
}
save(customer);
关于java - Spring JPA @事务原子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16690867/