出现no session or session was closed这样的异常不多解释了,网上已经一大堆。
但还是提不推荐把延迟加载特性去掉,而是必要时自己采取办法得到想要的对象。这样做更加灵活和效率高。虽然是避免不了一些代码量。
之前采取的方案是在session未关闭之前,把其他表对象查询出来并且clone。不过现在无意中发现其实hibernate其实已经提供初始化的方法了,而未必自己去clone了。具体就是利用Hibernate.initialize() 这个方法。
例子如下:
/**
* 获取Prescription中其他扩展属性对象。
*
* @param result
*/
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延迟加载解决”主要涉及如何理解和解决与之相关的常见问题。 **1. 延迟加载概念** 延迟加载是一种优化策略,它使得关联的对象在真正需要时才从数据库中加载,而不是在加载主对象时立即...
当你尝试在Controller层或者视图层访问懒加载的属性时,如果Session已经关闭("no Session..."错误),就会抛出`org.hibernate.LazyInitializationException`。这是因为懒加载的代理对象需要Session来执行数据库查询...
Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed ``` - **日志记录**:为了更好地诊断问题,可以使用log4j等工具进行日志...
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:225) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService...
4. **使用代理对象**:可以考虑在业务逻辑中,先检查对象是否已经被初始化,如果是代理对象,尝试触发加载,例如使用Hibernate的Hibernate.initialize()方法。 5. **避免在视图层操作持久化对象**:视图层应尽量...
标题 "解析 this.initialize.apply(this, arguments)" 涉及到的是JavaScript编程中的一个关键概念,尤其是在对象构造和类继承的情景下。`this` 关键字在JavaScript中扮演着核心角色,它指的是函数调用时的上下文,而...
在描述"延迟加载类Lazy的使用示例"中,我们可以预期在`Lazy.Object.Initialize.Console`这个项目中包含一个使用`Lazy<T>`的控制台应用程序示例。这个示例可能展示了如何在多线程环境中利用`Lazy<T>`确保安全初始化,...
- 解决方法之一是在关闭 Session 之前加载关联对象,如通过 `session.evict(user)` 或 `Hibernate.initialize(user.getPermissions())`。 - 另一种解决办法是在 HQL 查询或 Criteria 查询中使用 Join Fetching。 ...
当Session关闭后访问延迟加载的对象时,会抛出`LazyInitializationException`异常,可以通过提前调用`Hibernate.initialize()`或在Session关闭前查询所需属性来解决。 2. **集合**:在一对多或集合关联中,可以...
Ajax-jquery.initialize.zip,用于动态创建元素初始化的jquery插件(几年前很好,在2019年 考虑react或其他东西而不是jquery),ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和...
错误表现:在Session关闭后尝试访问懒加载属性,抛出“org.hibernate.LazyInitializationException: could not initialize proxy - no Session”异常。 解决方案:理解并合理使用Open Session in View(OSIV)模式...
Open Session in View (OSIV) 模式是一种在基于Hibernate的Web应用程序中处理持久化数据的策略,它允许在视图层(例如JSP页面)中安全地访问延迟加载的对象,而无需担心Session已关闭的问题。以下是关于这个模式及其...
总之,理解Hibernate的自动更新机制是解决问题的关键。通过控制实体的生命周期,我们可以有效避免不期望的数据库更新,优化应用程序的性能,同时保证数据的正确性。在实践中,开发者应不断积累经验,以应对各种复杂...
为了解决这个问题,我们可以使用 Spring 提供的一个支持类OpenSessionInViewFilter,这个类可以在发起一个页面请求时打开 Hibernate 的 Session,并保持这个 Session 的生命周期,直到这个请求结束。这样可以确保 ...
避免这个问题的方法是在访问懒加载属性之前确保Session仍然打开,或者显式地在需要时加载属性,如使用`Hibernate.initialize()`方法。 ### 5. MappingException - **MappingException: Error reading resource**:...
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...
jquery.initialize 1.4.0 1.4.0 之前的最新更新:添加了子元素数据绑定。 最新更新至 1.3.0:数据属性、模板属性和字符串模板替换。 一个简单的 jQuery 元素初始值设定项上下文插件。 该插件使元素初始化并将定义...
- 如果采用了延迟加载机制但希望在某些情况下实现非延迟加载,可以通过`Hibernate.initialize()`方法强制加载关联对象。 #### 十一、对象持久化操作 - 对于`save`操作,如果对象已经与`Session`关联,则无需额外...
在使用PL/SQL Developer 12连接Oracle数据库时,可能会遇到“Could not initialize oci.dll”这样的错误提示。这个错误通常表明系统无法找到或正确加载Oracle客户端的oci.dll库文件,这是Oracle Instant Client的一...
3. 在需要访问懒加载属性时,确保在Session内进行操作,或者使用`Hibernate.initialize()`手动初始化。 至于“工具”标签,这可能指的是使用特定的工具或插件来辅助理解和调试Hibernate的懒加载行为,比如日志工具...