由于项目比较小,因而没用延迟加载。所有的延迟都是false,这样容易造成以下问题:
session = this.getSession();
tx = session.beginTransaction();
session.delete(handset);
tx.commit();
以上的代码没有错误不过在添加级联删除后,代码如下:
session = this.getSession();
tx = session.beginTransaction();
//删除级联关系!!
List<CheckLock> checkLocks = session.createQuery("from CheckLock cl where cl.handset.handsetId = "+ handset.getH andsetId()).list();
for(int i =0 ; i<checkLocks.size() ; i++){
checkLocks.get(i).setHandset(null);
}
session.delete(handset);
tx.commit();
结果会报:a different object with the same identifier value was already associated with the session
问题原因:这是由于handset传来时是session.close的,就是说它是非持久状态的。而对于方法内部的session,由于它进行了级联查询,又由于延迟得关闭,所以当session查出CheckLock的同时也将其级联的handset对象查出并纳入session管理之中,这时就存在一条数据库记录2个handset对象的情况。一个是被传进来,非持久的不被session管理的handset,一个是通过级联查询的被session 管理的handset,。所以由于你删除的是非持久化handset,它要先纳入session的管理,就是持久化但是显然此时的session内已经有个Handset对象因而会抛出上述异常
问题的解决: 没什么好的解决方法,最好是传来ID之后重新查出handset删除就会没问题(以前觉得这种方式不好,会使得 dao重新查询数据库。其实是我多心了,由于级联查询造就将handset存于内存中。因而Hibernate只须调用缓存即可获得结果。)
PS:查了一下hql的删除方法:
int i = session.createQuery("delete Handset hs where hs.handsetId = " + handsetId).executeUpdate();
返回的是更新(删除)的记录数。不过 executeUpdate 方法是直接单独执行的,它不会等待事物的提交。
分享到:
相关推荐
### Hibernate延迟加载深入剖析 #### 一、概述 在现代软件开发中,特别是与数据库交互的应用场景下,Hibernate作为一款流行的Java持久层框架,提供了多种高效处理数据的技术。其中,延迟加载(Lazy Loading)是一...
《Hibernate延迟加载与代理模式解析》 在Java的持久化框架Hibernate中,延迟加载(Lazy Load)是一项重要的优化策略,其核心目标是提高系统性能,减少内存占用,避免不必要的数据库交互。延迟加载允许我们在需要...
集合类型的延迟加载是Hibernate延迟加载机制中最能显著提升性能的部分。在Hibernate中,集合类型的延迟加载通过使用自定义的集合类实现,如`net.sf.hibernate.collection.Set`,而非标准的`java.util.Set`。这样,...
### Hibernate延迟加载以及利用Spring #### 一、Hibernate延迟加载概念与原理 在理解Hibernate的延迟加载机制之前,我们首先需要了解什么是延迟加载。延迟加载(Lazy Loading)是一种设计模式,其核心思想是在真正...
### Hibernate延迟加载详解 #### 一、什么是延迟加载? 延迟加载是一种优化技术,在软件开发中广泛应用于各种场景,尤其在数据库交互中尤为重要。其核心思想是仅在确实需要某个资源时才加载它,而非一开始就加载...
详细介绍hibernate延迟加载,对hibernate初学者有一定的帮助
本文将深入探讨几种解决Flex与Hibernate延迟加载问题的方法,并着重讲解使用Gilead的方案。 1. **LCDS的Hibernate Adapter**:Adobe LiveCycle Data Services (LCDS) 提供了一个Hibernate适配器,可以处理延迟加载...
在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种重要的优化策略,它的核心思想是“延迟加载”或“按需加载”。默认情况下,当一个实体被加载时,并不会立即加载其关联的对象或集合,而是在真正需要...
hibernate3的属性延时加载是个很有意义的东西,它能让你把你不想加载到内存里的东西在查询的时候排除。 我相信来下载这个东西的人都已经很了解这一块的知识了,只是配不对那个类增强器才来下载我这个文件。 这些...
在处理大数据量或者复杂数据结构时,Hibernate引入了延时加载(Lazy Loading)机制,以提高应用程序的性能。本文将深入探讨在JSP(JavaServer Pages)环境中,如何理解和应对Hibernate的延时加载问题。 首先,我们...
在 Hibernate 框架中,延迟加载(Lazy Loading)是一种优化数据访问性能的重要技术。它允许我们只在真正需要数据时才从数据库加载,避免一次性加载大量数据导致的内存消耗和性能瓶颈。当我们处理与实体相关的集合...
Hibernate的延迟加载(Lazy Loading)和懒加载机制(Lazy Initialization)是优化ORM框架性能的重要策略。这个机制的主要目的是提高程序的效率,减少不必要的数据库交互,只在真正需要数据时才去加载它们。以下是对...
主要介绍了Java的Hibernate框架中的缓存和延迟加载机制,Hibernate是注明的Java下SSH三大web开发框架之一,需要的朋友可以参考下
### Hibernate延迟加载详解 #### 什么是Hibernate延迟加载? 在探讨Hibernate延迟加载之前,我们先简要回顾一下Hibernate框架。Hibernate是一种流行的Java持久层框架,它提供了对象关系映射(ORM)的功能,允许...
《Hibernate延迟加载详解》 Hibernate作为Java领域中的一个强大的对象关系映射框架,提供了许多优化数据库操作的策略,其中之一便是延迟加载(Lazy Loading)。延迟加载机制旨在减少不必要的性能消耗,只在真正需要...
【hibernate 延迟加载】 在Java的持久化框架Hibernate中,延迟加载(Lazy Loading)是一种优化数据库访问性能的技术。它允许我们在需要时才加载关联的对象,而不是在初始查询时就一次性加载所有数据。这有助于减少...
Hibernate延迟加载是ORM框架Hibernate中的一个重要特性,它旨在提高应用程序的性能和效率。延迟加载(Lazy Loading)策略允许我们仅在需要访问一个对象或其属性时才从数据库加载它们,而不是在初始加载实体时就一次...
**标题:“Hibernate之数据加载方式”** 在Java的持久化框架中,Hibernate是一个非常重要的工具,它简化了数据库操作,提供了对象关系映射(ORM)的功能。本篇将深入探讨Hibernate的数据加载方式,帮助开发者更好地...