【发布时间】:2013-05-22 11:43:43
【问题描述】:
使用 Hibernate JPA 和 Spring @Transactional(使用 Atomikos JTA 实现)我的系统中有以下实体:
- 订购
- Orderline(包含对订单的引用)
- 客户
在使用@Transactional 注释的服务类方法addOrder 中,我想在一个事务中执行以下步骤(它是一个原子功能块)。
- 坚持订单
- 坚持订单线
- 坚持客户
在第 1 步(保持订单)我希望 JPA 回滚任何 Exception。
在第 2 步(保持订单线)我想忽略在保持订单线期间出现的任何错误。因此,如果我有 10 条订单线并且 1 条因任何原因(例如违反约束)失败,我想继续使用其他订单线。
在第 3 步如果有任何 Exception,我希望 JPA 回滚整个事务,以及在第 1 步和第 2 步中完成的所有事情。
到目前为止我遇到的问题:
- 在
Exception的情况下,JPA 将事务标记为“仅回滚”。因此,在此之后(和之前)的所有内容都会回滚,但我想在第 2 步忽略Exception。 - JPA 仅在调用
flush()或commit()之后才知道约束冲突,这通常是在@Transactional方法完成之后。我需要在我的方法中知道它。 - 试图在单独的
@Transactional方法中拆分每个步骤,但由于它们需要使用相同的Transaction,这不会改变前两个问题。
最好的方法是什么?
更新
我是否应该将所有验证都放在 Java 中并手动检查记录是否已经存在?
【问题讨论】:
标签: java spring hibernate jpa spring-transactions