仅对错误对象进行Spring事务回滚,并为其隐藏stacktrace

时间:2018-06-21 07:47:34

标签: spring hibernate jpa spring-data-jpa spring-transactions

我有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个对象(统一名称),并跳过1个具有双重名称的对象。但是,如果我尝试插入dublicate,则会得到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仅复制对象。很好。但是在日志中打印此异常stacktrace /如何隐藏该堆栈?

1 个答案:

答案 0 :(得分:0)

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

Imho,这将是一个hack,您应该做的是在保存对象之前先对其进行验证。

这样,您可以确定可以提交整个“批处理”。