尽管使用 @Transactional(propagation=Propagation.REQUIRES_NEW) 获取 LazyInitializationException
Getting LazyInitializationException although using @Transactional(propagation=Propagation.REQUIRES_NEW)
我将 jHipster 与 Spring 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
异常。
- 尽管方法在其自己的事务中 运行 为什么会抛出此异常?
- 不应该因为会话仍然打开而延迟加载列表吗?
可能是因为启动了一个新的事务,entityA变成了"detached",所以抛出了LazyInitializationException。
可以这样使用:
@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都是真的。
我将 jHipster 与 Spring 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
异常。
- 尽管方法在其自己的事务中 运行 为什么会抛出此异常?
- 不应该因为会话仍然打开而延迟加载列表吗?
可能是因为启动了一个新的事务,entityA变成了"detached",所以抛出了LazyInitializationException。
可以这样使用:
@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都是真的。