【问题标题】:Initializing a lazy collection in the entity Getter. How right/wrong it is?在实体 Getter 中初始化惰性集合。它有多对/多错?
【发布时间】:2014-07-08 07:56:06
【问题描述】:

我正在 JSF 2.0 + Hibernate 作为 ORM 下开发一个 Web 应用程序。每次我不得不加载惰性集合时,我都厌倦了遇到问题,因此我找到了一种方法,该方法包括通过 DAO 类将集合中的 getter 方法 加载到我的 POJO 类 类中,如果这是PersistentBag 类的一个实例。

基本上是这样的:

public List<Entity> getLazyCollection()
{
    if (this.lazyCollection instanceof PersistentBag)
    {
        this.lazyCollection = EntityDAO.findById(this.id);
    }

    return this.lazyCollection;
}

您认为这种方法的正确/错误程度如何?谢谢。

编辑:我没有说清楚。加载是在我的 POJO 类中完成的,而不是在 JSF Bean 中完成的。

【问题讨论】:

  • 这是要在每次getter被命中时重新加载集合?
  • 您要解决的具体问题是什么?
  • @EvanKnowles 我不这么认为,因为当为具体实例加载集合时,lazyCollection 成员的类是实际的 List 类,而不是休眠“代理”类 PersistentBag ,所以 if 检查失败并返回lazyCollection 成员。我遇到的问题是每次 Hibernate 尝试初始化 Lazy 集合时它都会失败,因为 Hibernate 会话已“关闭”。

标签: java hibernate jsf lazy-loading


【解决方案1】:

这将在每次请求时从 Hibernate Session 加载 Collection,每个 HTTP 请求可能会加载很多次。使用 JSF 2.x,您最好将 Collection 本身加载到 bean 的构造函数/初始化程序中,并使用此缓冲区而不是每次都访问 Hibernate Entity 属性:

@ManagedBean
@ViewScoped
public class ManagedBean{

    List<Entity> lazyCollection;

    public void init(){
        if (!FacesContext.getCurrentInstance().isPostback()) {
            lazyCollection = new ArrayList(EntityDAO.findById(this.id));
        }
    }

    //Getter

}
<f:metadata>
    <f:event type="preRenderView"
        listener="#{managedBean.init()}" />
</f:metadata>

顺便说一下,这是关于如何在应用程序中管理 Hibernate 会话的问题。您会收到LazyInitializationException,因为 Session 已经过期,因为您可能正在实施 Session per Request 策略。您无法保证 Hibernate 能够在与视图的下一次交互中恢复卸载的值。

解决方案要么将您的值存储在托管 Bean 中,要么让 Hibernate 加载它们。

另请参阅:

【讨论】:

    猜你喜欢
    • 2012-09-14
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2015-11-18
    • 1970-01-01
    • 2014-07-10
    相关资源
    最近更新 更多