【问题标题】:Getting LazyInitializationException although using @Transactional(propagation=Propagation.REQUIRES_NEW)尽管使用 @Transactional(propagation=Propagation.REQUIRES_NEW) 得到 LazyInitializationException
【发布时间】:2016-09-25 02:32:42
【问题描述】:

我使用 jHipsterSpring Data JPA 并有以下方法:

@Transactional(propagation=Propagation.REQUIRES_NEW)
public void doSomeWork(EntityA entityA) {
  // some code
  List<EntityB> entityBList = new ArrayList<EntityB>();
  entityBList.add(new EntityB());
  entityA.addAllEntityB(entityBList);
}

在最后一行我得到一个我不明白的org.hibernate.LazyInitializationException 例外。

  • 虽然该方法在其自己的事务中运行,但为什么会抛出此异常?
  • 不应该只是延迟加载列表,因为会话仍处于打开状态?

【问题讨论】:

  • 你为什么使用 REQUIRES_NEW?
  • 我使用 REQUIRE_NEW 因为这个方法是在循环中从另一个类调用的,我希望在每次迭代后实体都被持久化。如果一个事务在循环中失败,我希望之前的迭代已经持久化。

标签: java hibernate spring-transactions lazy-initialization


【解决方案1】:

可能会抛出 LazyInitializationException,因为启动了一个新事务,结果 entityA 变得“分离”。

可以这样使用:

@Transactional
public void addEntityB(long entityAId, entityB) {
  EntityA entityA = loadEntityA(entityAId);
  addEntityBToEntityA(entityA, entityB);
  saveEntity(entityB);
}

以这种方式从外部调用:

for (EntityB entityB : entityBList) {
  try {
    addEntityB(entityAId, entityB);
  }
  catch(Exception e){
    log(e);
  }
} 

确实,您每次都会加载 entityA。

【讨论】:

  • 非常感谢,你把我带到了正确的轨道上。由于 EntityA 被传递到此事务方法,但在外部获取它会被分离。因此,首先在事务方法中获取它解决了这个问题。
猜你喜欢
  • 2011-10-05
  • 2013-03-23
  • 1970-01-01
  • 2017-11-18
  • 2020-06-23
  • 1970-01-01
  • 2011-01-24
  • 2019-07-12
  • 2015-10-02
相关资源
最近更新 更多