首页 > 解决方案 > 仅针对错误对象的 Spring 事务回滚并为其隐藏堆栈跟踪

问题描述

我有 100 个对象,我想将其保存到数据库。

@Service
public class TestService {

  private final TestDao testDao;

  public TestService(TestDao testDao) {
    this.testDao = testDao;
  }

  @Transactional
  public void saveTest() {
    for (int i = 0; i < 100; i++) {
      Test test = new Test();
      if (i == 10 || i == 20) {
        test.setName("123");
      } else {
        test.setName(UUID.randomUUID().toString());
      }
      testDao.save(test);
    }
  }
}

我对名称列有 uniq 约束,如果我尝试用某个名称保存 2 个对象 - 我会遇到异常。

我需要保存 99 个对象(uniw 名称)并跳过 1 个名称重复的对象。但是,如果我尝试插入重复,我会得到 Ecxeption 和事务回滚所有对象。我改变了我的 dao savee() 方法:

@Slf4j
@Repository
public class TestDao {

  @PersistenceContext
  private EntityManager entityManager;

  @Transactional(propagation = Propagation.REQUIRES_NEW)
  public void save(Test test) {
    entityManager.persist(test);
  }
}

Propagation.REQUIRES_NEW - 在每个对象上启动内部事务并且 rollbak 只复制对象。它很好。但是在日志中打印此异常堆栈跟踪/如何隐藏此堆栈跟踪?

标签: springhibernatejpaspring-data-jpaspring-transactions

解决方案


你可以为你的日志框架编写一个日志过滤器(例如,Logback Filter)。

恕我直言,这将是一个 hack,您应该做的是在保存对象之前验证您的对象。

这样,您可以确保可以提交整个“批次”。


推荐阅读