我正在使用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中完成的。
答案 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加载它们。
另见: