我必须在一个事务中保留一个包含 OL 对象列表的对象 O:
@Entity
public class O {
@OneToMany
private List<OL> olist;
// getters/setters
}
我正在从文件(xml 接口)中读取 O 和 OL,并且必须将它们插入到数据库中。条件如下:如果在持久化 OL 对象时抛出异常,则忽略并继续处理其他 OL:
@Transactional
private persistO(...) {
O o = new O();
o.set(...);
oDao.persist(o);
for (int i = 0; i < olCount; i++) {
OL ol = new OL();
ol.set(...);
try {
olDao.persist(ol);
em.flush();
}
catch(ConstraintViolationException ex) {
logger.warn()...;
}
}
}`
问题是,首先ConstraintViolationException
事务被设置为 rollbackOnly 并且没有任何东西被持久化。
org.springframework.transaction.TransactionSystemException:
Could not commit JPA transaction;
nested exception is javax.persistence.RollbackException:
Transaction marked as rollbackOnly
问题:如何使用 JPA(Hibernate + Spring)实现这一点?
笔记
- 我知道可以先在数据库中进行查询,确保 OL 对象还不存在,但我们假设过程非常复杂,性能会受到很大影响。
- 该要求不允许我在新事务中保留 OL 对象(全有或全无),因此
@Transactional(propagation = Propagation.PROPAGATION_REQUIRES_NEW)
不能使用。