Spring JPA - 实体分离?关于例外?

时间:2016-09-16 15:58:00

标签: java spring jpa

我不确定我是否正确,但我有一个交易方法,并且在其中我获取了一个项目列表。现在,在处理其中一个项目时,我遇到了一个无效的数据使用异常[null被传递到一个存储库,而罚款就抛出了这个异常,这很好],并且在得到该异常后,我抓住它,并标记该项目正在处理失败'。事务方法结束但更改不会通过。

@Transactional
public void method(){    
  try{
    List items = itemRepo.getItems(NOT_SUBMITTED);
    for(Item item: items){
      processItem(item); //this is where the exception happens
    }
  }
  catch(Exception e){
    item.setStatus(FAILED) // this doesn't go through to the db
  }
}

private void processItem(Item item){
  otherRepo.findOne(item.X); //item.X is null, and I get "invalid data usage" exception
}

我觉得这个物体在某种程度上已经脱离了;不知道为什么。我做了一个测试,我自己在try块中抛出异常,工作得很好。状态得到了恰当的反映。

我尝试再次抓取这个对象,执行itemRepo.findOne(item).setState(FAILED),没有工作。我试过了,itemRepo.save(item) - 没有用。

任何指针?

由于

1 个答案:

答案 0 :(得分:0)

JPA实现抛出异常,该实现还将事务状态设置为setRollbackOnly。这就是为什么当你抛出异常时可以保存失败状态的原因。

一旦JPA entityManager抛出异常就完成了,你就不能再使用那个entityManager了。将项目状态保存为失败,必须使用不同的entityManager实例在单独的事务中。