程序异常:a different object with the same identifier value was already associated with the session
原因:因为在hibernate中同一个session里面有了两个相同标识
但是是不同实体,当这时运行saveOrUpdate(object)操作的时候就会报这个错误。
其实要解决这个问题很简单,只需要进行session.clean()操作就可以解决
了,但是你在clean操作后面又进行了saveOrUpdate(object)操作,有可能
会报出"Found two representations of same collection",
通过session.refresh(object)方法就可以解决了,注意,当object不
是数据库中已有数据的对象的时候,不能使用session.refresh(object)因
为refresh是从hibernate的session中去重新取object,如果session中没
有这个对象,则会报错所以当你使用saveOrUpdate(object)之前还需要判
断一下
当然这个问题最容易解决的办法还是使用Hibernate里面自带的merge()
方法。不过我始终觉得碰到问题就用这种软件自带的非常用方法
(和saveOrUpdate(),save(),update()相比)感觉十分不爽。
后来我还发现这种错误经常出现在一对多映射和多对多映射,请大家在
使用一对多和多对多映射的时候要小心一些
Hibernate 疑难异常及处理
1、a different object with the same identifier value was already associated with the session。
错误原因:在hibernate中同一个session里面有了两个相同标识但是是不同实体。
解决方法一:session.clean()
PS:如果在clean操作后面又进行了saveOrUpdate(object)等改变数据状态的操作,有可能会报出"Found two representations of same collection"异常。
解决方法二:session.refresh(object)
PS:当object不是数据库中已有数据的对象的时候,不能使用session.refresh(object)因为该方法是从hibernate的session中去重新取object,如果session中没有这个对象,则会报错所以当你使用saveOrUpdate(object)之前还需要判断一下。
解决方法三:session.merge(object)
PS:Hibernate里面自带的方法,推荐使用。
2、Found two representations of same collection
错误原因:见1。
解决方法:session.merge(object)
以上两中异常经常出现在一对多映射和多对多映射中
转自:
http://hi.baidu.com/phoenix_85/blog/item/6f8b5bd06f21cb83a0ec9cbf.html
|
分享到:
相关推荐
在本示例中,我们探讨的是如何利用SpringMVC和Hibernate这两个流行的Java Web开发框架来实现学生表数据的增、删、改(CRUD)操作。SpringMVC是Spring框架的一部分,专门处理Web应用程序的请求-响应流程,而Hibernate...
在事务管理方面,Session提供了`beginTransaction()`方法来开启一个事务,这标志着一个数据库操作单元的开始。在事务中执行的数据库操作,如`save()`, `update()`, `delete()`等,都会被事务隔离,并在事务提交(`...
一对多关系则是一个实体可以对应多个实体,例如一个班级可以有多名学生。 Maven用于管理项目的构建、依赖和版本控制。在本案例中,Maven的pom.xml文件会列出所有必要的依赖,包括Hibernate库、MySQL驱动和其他可能...
a different object with the same identifier value was already associated with the session 是一种常见的异常,通常是由于在 Hibernate 中同一个 session 里面有了两个相同标识但是是不同实体所致。解决方案有...
- 一对一关系的两个实体类中,必须有一个实体类的主键是另一个实体类的外键,且两个实体类不能同时定义外键。 - 避免循环引用,否则可能导致无限递归的问题。 8. **优化技巧**: - 使用`fetch="join"`属性可以...
这可能包括两个表,一个是一对多关系的"一"端,比如"Student"表,有主键"id";另一个是"多"端,如"Course"表,其中有一个外键"student_id"引用"Student"表的"id"。在执行这个SQL脚本后,数据库将准备好一对多关联的...
04 04Hibernate_Composite : 复合主键的使用,在开发中很少用到,一般良好的设计都会为一个表添加一个自动增长的主键标识列。其中重点配置方法和Hibernate中普遍采用的方法链编程的使用。还需注意可以将组合主键构建...
在这个压缩包中,我们有两个主要的部分:Hibernate 3.3.2和Hibernate Annotation 3.3.4。 **一、Hibernate 3.3.2** Hibernate 3.3.2是该框架的一个稳定版本,发布于2009年。这个版本包含了对JPA(Java Persistence ...
同时,Hibernate还提供了对象的唯一标识机制,使得每个持久化对象都有一个唯一的标识符,这对于对象的检索和更新非常重要。 #### 实作equals()和hashCode() 为了确保Hibernate能够正确地识别和处理Java对象,开发者...
3. 实体类需要有一个属性作为唯一标识,通常为id。 4. 为了确保数据的完整性和避免歧义,建议使用包装类而非基本类型。例如,分数属性可以使用Integer而非int,因为null值可以表示未参加考试。 **Hibernate主键生成...
- **维护线程安全的缓存**:SessionFactory维护了一个线程安全的缓存,用于存储Session的配置信息和其他元数据。 通过以上介绍可以看出,Hibernate不仅是一款功能强大的ORM框架,而且其设计理念和架构设计也非常...
总结,Hibernate是一个功能丰富的ORM框架,通过Hibernate Annotations,我们可以更方便地进行对象的持久化,减少与数据库交互的复杂性,提高开发效率。这个中文API文档对于理解和使用Hibernate将大有裨益,无论是...
在这个“Hibernate开发lib包”中,包含的两个主要部分是“Hibernate 3.3 Annotations & Entity Manager”和“Hibernate 3.3 Core Libraries”,它们对于理解Hibernate的核心功能和使用方式至关重要。 1. **...
2. **主键(Primary Key)**: 每个实体都有一个唯一的标识符,称为主键。在Hibernate中,主键通过`@Id`注解标记,并可以使用`@GeneratedValue`控制自增策略。 3. **持久化(Persistence)**: Hibernate通过`Session...
Hibernate 是一个流行的开源对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。对于初学者来说,理解并应用Hibernate可能有些复杂,但通过简单的实例,我们可以快速入门。这个实例将涵盖Hibernate...
例如,一个`AddUserAction`可能会处理用户的新增用户请求,调用Hibernate的Session接口来保存新的用户对象到数据库。 在`testHibernateAndStruts`目录下,可能包含了一些关键的类和文件,如控制器类(Controller)...
Hibernate是一个开源的ORM框架,它为Java开发人员提供了在Java应用程序中操作数据库的强大工具。通过将Java类与数据库表之间的映射关系进行管理,Hibernate简化了数据访问层的代码编写,使得开发者能够更专注于业务...
每个实体类都有一个唯一的标识符,即主键,通常由@Id注解标识。实体类可以通过@Entity注解声明,并使用@Table注解指定对应的数据库表名。字段可以通过@Column注解来定义其在数据库表中的映射。 hibernate.cfg.xml...
使用注解或XML文件进行映射,例如,使用`@Entity`注解标识一个类为实体,`@Table`指定对应的表名,`@Column`定义属性对应的列。通过这种方式,Hibernate可以自动将对象的状态转换为数据库记录。 5. **...