Hibernate 如何保持冬眠';s会话打开,直到呈现页面

Hibernate 如何保持冬眠';s会话打开,直到呈现页面,hibernate,spring,lazy-loading,oracle-adf,Hibernate,Spring,Lazy Loading,Oracle Adf,我有以下问题: 我正在使用Oracle ADF作为我的应用程序的视图和控制器 使用OpenSessionInViewFilter,我截获请求并打开Hibernate的会话,bean的方法完成后它就会关闭 我需要的是在呈现页面之前保持会话打开,因为在我的JSP中,我使用从DB加载的对象的惰性属性 例如: 当我输入index.jspx时,将执行IndexBean#main() public class IndexBean{ private DBObject myDBObject;

我有以下问题:

  • 我正在使用Oracle ADF作为我的应用程序的视图和控制器
  • 使用OpenSessionInViewFilter,我截获请求并打开Hibernate的会话,bean的方法完成后它就会关闭
我需要的是在呈现页面之前保持会话打开,因为在我的JSP中,我使用从DB加载的对象的惰性属性

例如:

当我输入index.jspx时,将执行IndexBean#main()

public class IndexBean{
    private DBObject myDBObject;
    public String main(){
        this.myDBObject = this.myDAO.loadObjectFromDB();
        return null;
    }
}
在index.jspx中,我有:

...
<af:inputText value="#{myDBObject.lazyAttribute}" />
...
。。。
...
我希望Hibernate的会话保持打开状态,直到af:inputText被处理

这可能吗?怎么做


提前感谢

我建议您保持视图与模型的解耦,并消除延迟加载。在呈现页面之前,为其提供所需的所有数据。如果获取额外的数据确实是一个很大的性能冲击,那么考虑重新设计应用程序来单独呈现该数据。

< P>我建议您将视图与模型脱钩并消除延迟加载。在呈现页面之前,为其提供所需的所有数据。如果获取额外的数据确实是一个很大的性能命中,那么考虑重新设计应用程序来单独呈现该数据。

最后,我解决了我的问题。p> OpenSessionInViewFilter运行正常


我使用的
组件有问题。。。奇怪的是,
创建了一个新的请求。这个新请求正在关闭并创建一个新的Hibernate会话。

最后,我解决了我的问题

OpenSessionInViewFilter运行正常


我使用的
组件有问题。。。奇怪的是,
创建了一个新的请求。此新请求正在关闭并创建一个新的Hibernate会话。

数据的显示不是我的意愿,而是客户端的意愿。消除延迟加载,这不是一个选项。我的视图是解耦的,因为如果在之前或当时加载了属性,那么视图应该是透明的。。。af:inputText只调用getMyDBObject().getLazyAttribute()并需要该值。如果加载了该值,它将返回该值,否则它将向模型请求该值…@Neuquino如果您错了,getter getLazyAttribute()不是内部变量的简单getter,它使用了一些意外的依赖项,因此您的对象无法传递到其他层,因为该依赖项在那里不存在。如果您想继续使用2层设计进行编写,那没关系,但是您应该知道您将面临的所有问题(特别是当其他人—客户机编写表示层时)。要解决两层的问题,只需确保OpenSessionInViewFilter正常工作。如果视图向数据库请求数据,则它不会解耦。可以说,它不能“独立生存”——它依赖于数据库(位于另一层中)。数据的表示不是我的意愿,而是客户的。消除延迟加载,这不是一个选项。我的视图是解耦的,因为如果在之前或当时加载了属性,那么视图应该是透明的。。。af:inputText只调用getMyDBObject().getLazyAttribute()并需要该值。如果加载了该值,它将返回该值,否则它将向模型请求该值…@Neuquino如果您错了,getter getLazyAttribute()不是内部变量的简单getter,它使用了一些意外的依赖项,因此您的对象无法传递到其他层,因为该依赖项在那里不存在。如果您想继续使用2层设计进行编写,那没关系,但是您应该知道您将面临的所有问题(特别是当其他人—客户机编写表示层时)。要解决两层的问题,只需确保OpenSessionInViewFilter正常工作。如果视图向数据库请求数据,则它不会解耦。可以说,它不能“独立存在”——它依赖于数据库(位于另一层)。
OpenSessionInViewFilter
会在视图呈现之前保持它的打开状态。如果不是,则它必须连接错误。
OpenSessionInViewFilter
会在视图呈现之前保持打开状态。如果不是,则必须连接错误。af:table组件的问题通过添加以下属性得到解决:contentDelivery=“immediate”af:table组件的问题通过添加以下属性得到解决:contentDelivery=“immediate”