在请求范围entitymanager中重新附加实体

时间:2011-03-18 18:49:54

标签: hibernate jpa

我有一个Web应用程序,用户在其中进行选择,并在下面使用ajax,需要显示选择的详细信息。例如,用户在顶部框架和底部框架中选择一个人员,显示所有人员详细信息。有一堆人在懒散地加载。当调用任何集合时,我会得到一个lazyinitialization异常,这是预期的。我该如何避免这种情况。如何在ajax调用后重新附加entite到实体管理器。

3 个答案:

答案 0 :(得分:1)

有几种方法可以做你在这里做的事情:

  1. 对Person实体中的所有集合使用预先加载,但这可能会对性能产生不利影响。
  2. 如果您使用的是JPA 2.0,最简单的方法是使用OpenEntityManagerInView拦截器。然后你可以使用JSON Jackson完全json-ify Person实体并将JSON返回给视图。
  3. 如果选项#1和选项#2不可行,则应尝试加载实际的集合对象而不是代理。应该做的是,对于每个集合(比如集合A),在会话/事务关闭之前调用A.get(0).someGetter()。这将加载集合A中对象的实际实例。应该为每个集合完成。在某些情况下,您可以使用特定方法来执行此操作,例如本案例。
  4. 在会话/事务关闭之前,将完整的Person实体转换为其他类型的对象,例如JSON(因为您在此处使用ajax)。为此,迭代所有集合中的所有对象,并将它们填充到JSON对象中并返回相同的内容。

答案 1 :(得分:1)

尝试从已从会话中分离的实体获取集合时发生LazyInitializationException。

为此,您必须重新附加实体,即使其受管理。首先验证对象是否与会话相关联。

contains(Object object) : Check if this instance is associated with this Session.

根据对象状态,您可以在需要时再次阅读其状态&此后可以获取相关的集合。

refresh(Object object) : Re-read the state of the given instance from the underlying database.

答案 2 :(得分:-1)

我选择了本文中提供的解决方案。

http://9mmedia.com/blog/?p=272

感谢您抽出宝贵时间作出回应。