java - Spring JPA @事务原子

标签 java spring hibernate jpa spring-transactions

使用 Hibernate JPA 和 Spring @Transactional (使用 Atomikos JTA 实现)我的系统中有以下实体:

  • 订单
  • 订单行(保存对订单的引用)
  • 客户

在用 @Transactional 注释的 Service 类方法 addOrder 中,我想在一个事务中执行以下步骤(它是一个原子功能 block )。

  1. 坚持命令
  2. 遵守命令
  3. 留住客户

在第 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/

相关文章:

java - Hibernate 与 oracle 序列根本不起作用

java - 是否可以通过 DB 或 Rest 通过任务列表使 Camunda Webapps(Spring-boot 独立)更新 .bpmn

web-services - 空 SOAP 响应 - 使用 JBoss 4.2、Jaxb2、Java 1.6

java - 具有两个查找值的 Hibernate OnetoOne 映射

sql - Postgres : get min and max rows count in many to many relation table

java - 如何正确序列化 Hibernate 集合?

Java创建编译类型参数未知的泛型对象

java - spring-ws 错误动态创建 wsdl

Java平台独立加密

java - 奇怪的 Spring MVC 上下文配置行为