具体描述:A different object with the same identifier value was already associated...问题的处理
网上的解释:
hibernate的session缓存之前处理过的数据,比如查询某些信息如User对象,当第二次查询时,从缓存中取出来就可以了。也正是因为session中缓存的存在,导致处理不当时,会出现问题。比如如下场景:
-
查出来来一个User对象,id为1,此时用户再new一个id为1的用户(id是用户的主键),执行save操作就会导致NonUniqueObjectException的异常,因为主键值相同,但是引用的对象不同。
-
执行更新的过程中也可能存在这样的问题,如下面的程序中(来自于互联网,未验证):
class A{}
class B{
private A many_to_one_A;
}
public void update_A_B(A a) {
B b=findByA(a);
update(b);
update(a);
}
错误原因:传进来的A是一个独立实体,加载B后,b对象会加载一个a在这个session中,如此在update(a)时,session重新加载并update,如此重复了。
解决办法:
public void update_A_B(A a) {
B b=findByA(a);
update(b);
a=b.getMany_to_one_A();
update(a);
}
除此之外,网上还给出了解决办法:
-
session.evict(objPO);或者在update之前session.clear();,清除缓存,或者调用evict方法,将当前对象设置为detached的状态
-
用session的merge方法,但是这个方法可能逻辑不对。
----------------------------------------------------分割线,上面来自互联网----------------------------
我今天说的是另一种情形,也是我犯的一个错误。
一个人拥有多个账户的情形
public class PersonTest implements Serializable{
private Long id;
private String userId;
private String name;
private Set<AccountTest> accountTests = new HashSet<AccountTest>(); //一个人对应多个账户
…//getter、setter
}
账户类:
public class AccountTest implements Serializable { private long id; //id private String userAccount;//用户账户 private PersonTest personTest; …//getter、setter }
配置文件
PersonTest类的文件
<class name="PersonTest" table="t_persontest"> <id name="id" type="long"> <generator class="increment"/> </id> <property name="name"> <column name="name" length="64" not-null="true"/> </property> <property name="userId"> <column name="userId" length="64" not-null="true"/> </property> <set name="accountTests" cascade="all" inverse="true"> <key column="personTest"></key> <one-to-many class="AccountTest"/> </set> </class>
AccountTest的配置文件
<class name="AccountTest" table="t_accountTest"> <id name="id" type="long" unsaved-value="null"> <generator class="increment"/> </id> <property name="userAccount"> <column name="userAccount" length="64" not-null="true"/> </property> <many-to-one name="personTest" class="PersonTest" column="personTest"> </many-to-one> </class>
测试程序
@Test public void testMany2oneDoubleAdd2() { session.beginTransaction(); //初始化用户 PersonTest pt = new PersonTest(); pt.setName("test1"); pt.setUserId("ttt"); AccountTest at1 = new AccountTest(); at1.setUserAccount("account1"); at1.setPersonTest(pt); pt.getAccountTests().add(at1); AccountTest at2 = new AccountTest(); at2.setUserAccount("account2"); at2.setPersonTest(pt); pt.getAccountTests().add(at2); session.save(pt); session.getTransaction().commit(); }
执行到save方法时报的错误如下:
A different object with the same identifier value was already associated with the session : [com.data.hibernate.prptyref.AccountTest#0]
…
其实也就是在save pt的时候,发现at1和at2中的id都已经被赋值了,且都是为0,因此出现了上述报错。
解决的方法也很简单,就是AccountTest的id由long变为Long。
相关推荐
### 详解Hibernate事务处理机制 #### 一、引言 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了数据持久化的复杂性,还提供了一系列强大的功能来支持高效的...
【标题】"Hibernate做的留言板" 是一个基于Java的Web应用程序,使用了流行的持久化框架Hibernate来处理数据库交互。这个项目提供了完整的源代码,方便开发者直接在Eclipse集成开发环境中运行和学习。它不仅是一个...
使用struts、hibernate进行分页处理 使用struts、hibernate进行分页处理 使用struts、hibernate进行分页处理 使用struts、hibernate进行分页处理 使用struts、hibernate进行分页处理
在本文中,我们将深入探讨Hibernate的事务处理机制以及`flush`方法的用法,并分析为何在某些场景下会出现特定的异常。 首先,我们需要了解Hibernate中的事务处理。在Java应用中,事务通常与SessionFactory和Session...
在Java开发中,尤其是涉及到大数据量的处理时,人们往往会质疑ORM框架,如Hibernate,是否适合进行批量数据操作。然而,实际上,通过适当的技术手段,我们可以有效地解决Hibernate在批量处理时可能出现的性能问题。...
Hibernate 的主要特点是:支持多种数据库管理系统、提供了高效的数据访问机制、支持事务处理和缓存机制等。 Hibernate 环境搭建 要使用 Hibernate,首先需要搭建 Hibernate 的开发环境。下面是 Hibernate 环境搭建...
jackson-datatype-hibernate, 用于处理Hibernate的Jackson JSON处理器模块( http,Add 构建 Jackson 模块( jar ) 以支持JSON序列化和反序列化 Hibernate ( http://hibernate.org ) 特定数据类型和属性,特别是延迟...
9. **错误处理和日志记录**:理解Hibernate常见的错误和异常,如 detached entity passed to persist 等,并配置合适的日志系统,如Log4j或SLF4J,以便追踪应用运行状态。 总的来说,Hibernate AIP涵盖了从项目初始...
KingbaseV8的方言文件可以帮助Hibernate理解和处理KingbaseV8特有的SQL语法和特性。 总结来说,这个压缩包包含了不同版本的Hibernate核心库以及可能的KingbaseV8 JDBC驱动和方言实现,这些组件使得开发者能够利用...
一、Hibernate错误 Hibernate是Java持久层框架,它简化了数据库操作。常见的错误包括: 1. **配置错误**:如XML配置文件中的实体映射错误、数据源配置错误等,可能导致SessionFactory无法创建。 2. **SQL异常**:...
另一个挑战是错误处理和日志记录。在没有容器的日志框架支持时,需要引入如Log4j这样的日志库来记录执行过程中的信息和异常。 最后,对于复杂的数据模型,如多表关联和事务处理,Java SE应用中的Hibernate使用可能...
- **简化开发**: Hibernate 大大减少了开发者处理复杂 SQL 查询的工作量,使得数据库操作更加直观。 - **提高效率**: 通过缓存机制、懒加载等技术,Hibernate 可以有效提高应用程序性能。 - **增强可维护性**: 采用 ...
如果遇到错误,例如配置错误导致browse无法选择正确的项目目录,可能需要手动修改`.project`文件的natures部分,确保包含Hibernate的nature。 总的来说,Hibernate是Java开发中的重要工具,它通过ORM解决了数据库...
### Hibernate常见错误及解决办法 #### 一、Nodefaultconstructorforentity 错误 **问题描述**:在使用Hibernate执行查询语句时,系统抛出`Nodefaultconstructorforentity`错误。 **可能原因**:该错误通常是由于...
了解事务的ACID特性以及如何在Hibernate中处理事务,可以确保数据的一致性。 7. **一对多、多对一、多对多关联映射**: Hibernate 支持各种关联映射,如一对一、一对多、多对一和多对多。理解这些关联关系的建立和...
11. **事件监听器**:Hibernate允许注册事件监听器,对持久化对象的各种操作(如保存、更新、删除等)进行拦截和自定义处理。 以上就是`hibernate3.jar`中所包含的关键知识点。理解并熟练使用这些概念,可以帮助...
2. 支持复杂查询:除了HQL和Criteria API,Hibernate还支持原生SQL查询,以处理更复杂的查询需求。 3. 数据缓存:通过二级缓存机制,提高数据访问效率,减少对数据库的直接访问。 4. 支持事务:提供了事务管理和...
此外,Hibernate3提供了强大的关联映射功能,如一对一、一对多、多对一和多对多关系,使得处理复杂的数据库关系变得简单。 总的来说,Hibernate3是一个功能强大的ORM工具,简化了Java应用程序与数据库的交互,提高...
总结来说,Hibernate-Extensions是Hibernate的一个强大补充,它扩展了ORM的功能边界,使开发者能够更高效、更灵活地处理数据库操作。无论你是初学者还是经验丰富的开发者,这个完整的安装包都值得你拥有,因为它将为...