我在我的网络应用程序中部署了@Stateless ejb。此Web应用程序部署在glassfish V3.0.1
中我的域模型由两个类组成: Master 和 Slave ,主服务器与许多从服务器相关联。
我有一个jsf视图 MyView ,在我的ejb上调用方法 displaySlaves MyEjb
在我的无状态ejb MyEjb 的方法 displaySlaves 中执行此操作时,一切正常:
Master master = getEntityManager().find(Master.class, 0L);
Set<Slave> slaves = master.getSlaves();
System.out.println("Master : " + master + " and slaves "+ slaves.size());
但是,如果我尝试从我的视图 MyView 获取对master的引用( MyEjb 仅返回主实例,但不调用master.getSlaves())然后在 MyView 中,我在返回的主实例上调用getSlaves():
org.hibernate.LazyInitializationException:懒得初始化一个Slave集合:没有会话或会话关闭。
显然当线程退出ejb时,会话关闭。这就是错误的原因。
但是当我使用eclipseLink而不是hibernate时,一切都很好,我没有会话问题。退出ejb时,EclipseLink不会关闭事务。对于浏览返回的模型实例的视图编码比在ejb方法中获取模型实例的所有关联对象要容易得多。
是否有人有解释或解决方法使其与 Hibernate 一起使用?我之前的问题只是一个例子,实际上我有一个遗留应用程序,有许多映射类,并且重构使用eclipseLink所需的注释似乎是一项艰巨的任务。
任何帮助表示感谢。
组件:
答案 0 :(得分:1)
您所描述的是多年来一直困扰着开发人员。谣言说,Gavin King(Hibernate的创建者)开发了JBoss Seam,主要是为视图中的延迟加载提供一个干净的解决方案; - )
几个选项:
FetchType.EAGER
)