我在我的web应用程序中部署了@Stateless ejb。这个Web应用程序部署在GlassFish中V3.0.1在视图中延迟加载的休眠问题
我的域模型是由两类:硕士和从,主被关联到许多奴隶。
我有一个JSF视图MyView的,调用该方法displaySlaves我EJB MyEjb
当方法displaySlaves我无状态EJB MyEjb的我这样做,一切工作正常:
Master master = getEntityManager().find(Master.class, 0L);
Set<Slave> slaves = master.getSlaves();
System.out.println("Master : " + master + " and slaves "+ slaves.size());
但是,如果我尝试从我的角度来看MyView得到上主的引用(MyEjb仅返回主实例,但不调用master.getSlaves()),然后在MyView的我呼吁返回主实例,我得到getSlaves():
org.hibernate.LazyInitializationException:未能延迟初始化Slave集合:没有会话或会话关闭。
很明显,当线程退出ejb时,会话被关闭。这是错误的原因。
但是当我使用eclipseLink而不是休眠,一切都很好,我没有会话问题。 EclipseLink在退出ejb时不会关闭事务。对浏览返回的模型实例的视图进行编码要比在ejb方法中获取模型实例的所有关联对象容易得多。
有没有人有解释或解决方法,使其与休眠?我以前的问题只是一个例子,实际上我有一个遗留应用程序,它有很多很多映射类,重构需要使用eclipseLink工作的注解似乎是一项艰巨的任务。
任何帮助表示赞赏。
组件:
- Glassfish的3.0.1
- 视窗7 64位JDK太阳1.6.0.24
- 休眠3.5.6决赛
- tiredOldDevelopper V1最终 - 衰落。
谢谢你的回答。经过多次搜索,似乎没有什么魔术只是站在箱子外面。无论如何,Ejbs总是会吸吮,每次我必须工作时,我会陷入一个限制,如果这个项目是通过一些想法和Weld或Spring等帮助完成的,那么这个限制是不存在的(对于ejbs上的巨魔抱歉,但这是真的)。用自己的双手做一些事情比依靠太过封闭的东西更好。 – oliviert