我有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 /如何隐藏该堆栈?
答案 0 :(得分:0)
您可以为您的日志记录框架编写一个日志记录过滤器(例如Logback Filter)。
Imho,这将是一个hack,您应该做的是在保存对象之前先对其进行验证。
这样,您可以确定可以提交整个“批处理”。