1

我必须在一个事务中保留一个包含 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)不能使用。
4

1 回答 1

0

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

在两行之间阅读,您正在尝试进行不覆盖的添加。从设计的角度来看,这听起来有点可疑。没有现有的 O 怎么会有现有的 OL?您可以使用 SQL 盲目地删除任何孤立的 OL,如果这是正在发生的事情。这也提出了一个问题,你是否。使用代理键。

在添加任何 OL 实例之前,您可以添加新的 O 并持久化。然后,您可以刷新并检索 O,这将检索任何现有的 OL。然后,您将添加新的 OL 并坚持下去。

于 2013-11-11T14:50:56.770 回答