我在事务性ejb方法中的自创对象中遇到Hibernate延迟加载实体的问题。
@Entity
public class SampleEntity {
...
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<AnotherEntity> list;
...
}
EJB:
@Stateless
public class SampleEjb {
public void transactionalMethod() {
SampleEntity entity = //select entity from db
new SamplePojo().lazyLoad(entity);
}
}
POJO:
public class SamplePojo {
public void lazyLoad(SampleEntity entity) {
//there sometimes i have receiving javax.persistence.TransactionRequiredException
entity.getList().size();
}
}
有趣的是,这个问题有时会发生,有时候不会发生。我第一次在项目中遇到这个问题时,我通过将SamplePojo注入到我的EJB中来解决这个问题(我认为EJB事务不会注入到自己创建的对象中)。但是现在我意识到我的项目中还有其他地方类似于我在这里发布的地方,并且注入了交易并且代码运行良好。
是否应将事务范围包含在EJB方法中的用户创建对象中?我的代码与实体延迟加载是否有效是随机的情况吗? 有没有人以前遇到过这个问题?
答案 0 :(得分:1)
交易不会注入对象。事务附加到当前线程(使用ThreadLocal变量)。一旦线程启动一个事务,该线程中运行的每个代码都会在此事务的上下文中执行,无论您使用什么对象,直到事务结束(或者启动一个新事务)。
旁注:您的lazyLoad()
方法无法加载任何内容。您必须在getList()
返回的惰性列表上调用方法来加载它。