在视图中延迟加载的Hibernate问题

时间:2011-09-14 15:37:42

标签: hibernate glassfish eclipselink java-ee-6 ejb-3.1

我在我的网络应用程序中部署了@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所需的注释似乎是一项艰巨的任务。

任何帮助表示感谢。

组件:

  • Glassfish 3.0.1
  • windows 7 64位JDK Sun 1.6.0.24
  • Hibernate 3.5.6-Final
  • tiredOldDevelopper v1 final - fading

1 个答案:

答案 0 :(得分:1)

您所描述的是多年来一直困扰着开发人员。谣言说,Gavin King(Hibernate的创建者)开发了JBoss Seam,主要是为视图中的延迟加载提供一个干净的解决方案; - )

几个选项:

  • 在您的JPA元数据(FetchType.EAGER
  • 中禁用延迟加载
  • 了解臭名昭着的“open session in view pattern”,but don't use it
  • 如果您需要在视图中进行延迟加载,请考虑在CDI会话范围中放置一个扩展的持久化上下文(这是我更喜欢的)