`

使用Hibernate.initialize解决no session的延迟加载问题

 
阅读更多

出现no session or session was closed这样的异常不多解释了,网上已经一大堆。
但还是提不推荐把延迟加载特性去掉,而是必要时自己采取办法得到想要的对象。这样做更加灵活和效率高。虽然是避免不了一些代码量。
之前采取的方案是在session未关闭之前,把其他表对象查询出来并且clone。不过现在无意中发现其实hibernate其实已经提供初始化的方法了,而未必自己去clone了。具体就是利用Hibernate.initialize() 这个方法。
例子如下:
    /**
     * 获取Prescription中其他扩展属性对象。
     *
     * @param resultstruts2实现分页按钮
     */
    private void initializeProperties(PaginationSupport<Prescription> result) {
        List<Prescription> items = result.getItems();
        if (items != null && !items.isEmpty()) {
            List<Prescription> persistenceList = new ArrayList<Prescription>(
                    items.size());
            for (Prescription prescription : items) {
                Hibernate.initialize(prescription.getOffice());
                Hibernate.initialize(prescription.getDoctor());
                Hibernate.initialize(prescription.getDoctor().getOffice());
                Hibernate.initialize(prescription.getHospitalDistrict());
                Hibernate.initialize(prescription.getPatient());
                persistenceList.add(prescription);
            }
            result.setItems(persistenceList);
        }
    }
另还有种方法是采取spring的OpenSessionInViewFilter方法,把session关闭延迟到view层。不过我老是没配成功 - -  view层get扩展表对象时还是提示no session。再说了还是觉得这样的消耗有点大,因为把所有查询的session关闭时间都加大了。很多时候只是某些查询需要得到扩展表对象而已,没必 要把全部查询都影响到吧。

分享到:
评论

相关推荐

    hibernate延迟加载解决

    标题和描述提到的“hibernate延迟加载解决”主要涉及如何理解和解决与之相关的常见问题。 **1. 延迟加载概念** 延迟加载是一种优化策略,它使得关联的对象在真正需要时才从数据库中加载,而不是在加载主对象时立即...

    集成spring的hibernate懒加载

    当你尝试在Controller层或者视图层访问懒加载的属性时,如果Session已经关闭("no Session..."错误),就会抛出`org.hibernate.LazyInitializationException`。这是因为懒加载的代理对象需要Session来执行数据库查询...

    Hibernate延迟加载以及利用Spring

    Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed ``` - **日志记录**:为了更好地诊断问题,可以使用log4j等工具进行日志...

    HIbernate4.3.6整合c3p0所需jar

    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:225) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService...

    ssh_inte2模板常用方法&延迟加载问题

    4. **使用代理对象**:可以考虑在业务逻辑中,先检查对象是否已经被初始化,如果是代理对象,尝试触发加载,例如使用Hibernate的Hibernate.initialize()方法。 5. **避免在视图层操作持久化对象**:视图层应尽量...

    解析 this.initialize.apply(this, arguments)

    标题 "解析 this.initialize.apply(this, arguments)" 涉及到的是JavaScript编程中的一个关键概念,尤其是在对象构造和类继承的情景下。`this` 关键字在JavaScript中扮演着核心角色,它指的是函数调用时的上下文,而...

    Lazy.Object.Initialize

    在描述"延迟加载类Lazy的使用示例"中,我们可以预期在`Lazy.Object.Initialize.Console`这个项目中包含一个使用`Lazy&lt;T&gt;`的控制台应用程序示例。这个示例可能展示了如何在多线程环境中利用`Lazy&lt;T&gt;`确保安全初始化,...

    hibernate延迟加载技术详细解

    - 解决方法之一是在关闭 Session 之前加载关联对象,如通过 `session.evict(user)` 或 `Hibernate.initialize(user.getPermissions())`。 - 另一种解决办法是在 HQL 查询或 Criteria 查询中使用 Join Fetching。 ...

    Hibernate延迟加载

    当Session关闭后访问延迟加载的对象时,会抛出`LazyInitializationException`异常,可以通过提前调用`Hibernate.initialize()`或在Session关闭前查询所需属性来解决。 2. **集合**:在一对多或集合关联中,可以...

    Ajax-jquery.initialize.zip

    Ajax-jquery.initialize.zip,用于动态创建元素初始化的jquery插件(几年前很好,在2019年 考虑react或其他东西而不是jquery),ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和...

    Hibernate配置常见错误

    错误表现:在Session关闭后尝试访问懒加载属性,抛出“org.hibernate.LazyInitializationException: could not initialize proxy - no Session”异常。 解决方案:理解并合理使用Open Session in View(OSIV)模式...

    Open Session in View模式.PPT

    Open Session in View (OSIV) 模式是一种在基于Hibernate的Web应用程序中处理持久化数据的策略,它允许在视图层(例如JSP页面)中安全地访问延迟加载的对象,而无需担心Session已关闭的问题。以下是关于这个模式及其...

    如何解决hibernate自动更新实体类的问题共5页.pdf.zip

    总之,理解Hibernate的自动更新机制是解决问题的关键。通过控制实体的生命周期,我们可以有效避免不期望的数据库更新,优化应用程序的性能,同时保证数据的正确性。在实践中,开发者应不断积累经验,以应对各种复杂...

    Hibernate映射导致的几个异常

    避免这个问题的方法是在访问懒加载属性之前确保Session仍然打开,或者显式地在需要时加载属性,如使用`Hibernate.initialize()`方法。 ### 5. MappingException - **MappingException: Error reading resource**:...

    J2EE利用Hibernate采用B/S架构网页设计

    import org.hibernate.Session; import org.hibernate.cfg.Configuration; /** * Configures and provides access to Hibernate sessions, tied to the * current thread of execution. Follows the Thread Local...

    浅谈解决Hibernate懒加载的4种方式

    这种方法可以解决问题,但是缺点是无论后面是否使用该对象,hibernate都会向数据库发出SQL语句请求数据,造成不必要的性能浪费。 2. 修改对象关系文件:将lazy改写lazy=false,即关闭懒加载。这也可以解决问题,...

    jquery.initialize:一个简单的 jQuery 元素初始化器上下文插件

    jquery.initialize 1.4.0 1.4.0 之前的最新更新:添加了子元素数据绑定。 最新更新至 1.3.0:数据属性、模板属性和字符串模板替换。 一个简单的 jQuery 元素初始值设定项上下文插件。 该插件使元素初始化并将定义...

    hibernate的lazy策略forClass

    3. 在需要访问懒加载属性时,确保在Session内进行操作,或者使用`Hibernate.initialize()`手动初始化。 至于“工具”标签,这可能指的是使用特定的工具或插件来辅助理解和调试Hibernate的懒加载行为,比如日志工具...

    Plsql 12连接Oracle时出现Could not initialize oci.dll解决方案 oracle 客户端

    在使用PL/SQL Developer 12连接Oracle数据库时,可能会遇到“Could not initialize oci.dll”这样的错误提示。这个错误通常表明系统无法找到或正确加载Oracle客户端的oci.dll库文件,这是Oracle Instant Client的一...

    hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法

    为了解决这个问题,我们可以使用 Spring 提供的一个支持类OpenSessionInViewFilter,这个类可以在发起一个页面请求时打开 Hibernate 的 Session,并保持这个 Session 的生命周期,直到这个请求结束。这样可以确保 ...

Global site tag (gtag.js) - Google Analytics