繁体   English   中英

JPA,Spring嵌套事务

[英]JPA, Spring nested transactions

我必须在一个事务中持久保存包含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)

就交易而言,您所描述的内容听起来有些矛盾。 交易意味着全部或全部。 为什么OL添加失败?

在两行之间读取时,您尝试做一个没有覆盖的添加。 从设计的角度来看,这听起来有点可疑。 没有现有的O怎么会有现有的OL? 如果发生这种情况,您可以使用SQL盲目删除任何孤立的OL。 这也引发了一个问题。 使用代理键。

您可以添加新的O并保留,然后再添加任何OL实例。 然后,您可以刷新并检索O,这将检索任何现有的OL。 然后,您将添加新的OL并保留。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM