在实体Getter中初始化一个惰性集合。这是对还是错?

时间:2014-05-20 07:18:33

标签: java hibernate jsf lazy-loading

我正在使用JSF 2.0 + Hibernate开发一个Web应用程序作为ORM。每次我必须加载一个懒惰的集合时,我已经厌倦了遇到问题所以我发现了一种方法,它包括通过DAO类将getter方法中的集合加载到我的POJO类类中,如果这是PersistentBag类的一个实例。

基本上是这样的:

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

    return this.lazyCollection;
}

您认为这种方法的对与错程度如何?谢谢。

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

1 个答案:

答案 0 :(得分:1)

这将在每次请求时从Hibernate会话加载Collection,每个HTTP请求可能会多次。使用JSF 2.x,最好是在bean的构造函数/初始化程序中加载Collection本身,并使用此缓冲区而不是每次都访问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因为会话已经过期,因为您可能正在实施每个请求的会话策略。您无法保证Hibernate能够在下次与视图的交互中恢复卸载的值。

解决方案要么将您的值存储在Managed Bean中,要么启用Hibernate加载它们。

另见: