a different object with the same identifier value was already associated with the session
这个已经是hibernate的经典错误啦..
在hibernate3.0之后版本里,这个错误很好解决,session.merge(object)就可以了..
但是我用的却是老掉牙的hibernate2,
没有merge方法,所以只能用别的办法来解决了.
代码里.有两个数据实体,
1.工具(Tool),配置文件中:inverse=true,lazy=true
2 合同(Contract);配置文件中:inverse=false,lazy=true
对应关系为多对多的关系.
引发错误的相关代码片段如下:
Os4Contract contract = (Os4Contract) session.get(Os4Contract.class,
contractid);
// 总共移除合同的代维工具数量
int removeNum = 0;
// 合同原来拥有的"已添加工具数量"
int oldamount = contract.getTools().size();
for (int i = 0; i < tools.size(); i++)
{
tool = (Os4Tool) tools.get(i);
tool.getContracts().remove(contract);
contract.getTools().remove(tool);
/*
1.session.update(tool);
1.session.saveOrUpdate(tool);
2.session.evict(tool);
2.session.update(tool);
3.session.clear();//Found two representations of same collection
3.session.update(tool);
4.session.refresh(tool);
4.session.update(tool);
*/
其中,1,2,4 方法都试过,在update的时候就会提示a different object with the same identifier value was already associated with the session
第3个方法则是Found two representations of same collection 错误.
上面代码的意图是,将工具从合同中移除, 也就是把工具和合同的映射关系表相关记录给删除掉即可.
因为工具的配置文件中,inverse=true, 也就是说.这个关系映射表由合同来管理,
也就是说,如果要解除contract与tool之间的关系,保存tool是不能达到效果的,
必须保存contract,然后contract才会去维护关系映射表,
所以,就把session.update(tool);这句去掉了.而且这里tool没有做修改,完全没必要update一次,浪费性能.
呵呵,至此,感觉这个问题我其实并没有解决..我只是"避免"了而已..
如果真的有个场景,非要update的话.也只能"用一种蠢方法,先删后加,并且放到两个事务中了"
分享到:
相关推荐
Hibernate的核心在于提供对象-关系映射(ORM)服务,使得开发者能够以面向对象的方式来管理和操作数据库中的数据,从而减少了直接使用JDBC进行数据操作时的复杂性和错误。 为什么需要Hibernate? 在传统的JDBC编程中...
不过,由于文本中的网址重复出现,且重复信息过多,可以推断OCR扫描文档时可能存在识别错误或重复扫描,导致输出了大量相同内容。在实际使用时,应当忽略这些重复信息,专注于有效的知识点学习。
- SessionFactory:是Hibernate的核心,负责生成Session对象,是线程安全的。 - Session:代表一次数据库会话,执行CRUD操作的主要接口。 - Transaction:处理数据库事务,确保数据的一致性。 - Query:提供查询...
Struts2和Hibernate是两种非常重要的Java开源框架,它们分别在Web应用的MVC(Model-View-Controller)架构和对象关系映射(ORM)领域发挥着关键作用。这篇文章将深入探讨如何整合这两个框架,以及整合过程中涉及的...
在本文中,我们将深入探讨如何在MyEclipse中配置并使用Hibernate进行数据库操作。Hibernate是一个强大的对象关系映射(ORM)...通过这种方式,你可以轻松地在MyEclipse中使用Hibernate来管理数据库操作,简化开发过程。
Hibernate是一款强大的Java持久化框架,它为Java开发者提供了一种对象关系映射(ORM)解决方案,使得在Java应用中管理数据库变得更加便捷。本中文文档旨在详细介绍Hibernate的核心概念、配置、使用方法以及最佳实践。 ...
在使用Hibernate框架进行开发的过程中,经常会遇到各种各样的异常问题。这些问题可能会导致程序无法正常运行,甚至影响到系统的稳定性。本文将针对几个常见的Hibernate错误进行深入分析,并提供相应的解决方法。这些...
2. **解析映射信息,创建SessionFactory**:映射信息通常在.hbm.xml文件中定义,SessionFactory是线程安全的,用于创建Session实例。 3. **打开Session**:Session是Hibernate的主要工作接口,它负责与数据库交互,...
- 在Hibernate中,当Session关闭时,所有与之关联的持久化对象变为游离状态。在这个例子中,Customer对象在line6变为游离状态,因为Session在这一行被关闭。 13. 优化Hibernate查询性能: - 使用缓存机制,如一级...
首先,通过 `HibernateSessionFactory.currentSession()` 获取当前的 Session 实例,这是 Hibernate 中处理对象与数据库交互的基本单元。然后,开启一个新的事务 `t = session.beginTransaction()`。接下来,调用 `...
在Java Web开发中,Maven、Hibernate5以及反向...通过这个实践,开发者不仅可以学习到如何使用Maven和Hibernate5,还能理解反向工程在实际项目中的应用,提高开发效率,同时降低了因为手动创建实体类而可能导致的错误。
通过使用Hibernate,开发者可以使用Java对象而不是SQL语句进行数据操作,提高开发效率并减少错误。 **二、DAO设计模式** DAO设计模式是软件工程中常见的一个模式,主要用于隔离业务逻辑层与数据存储层的交互。DAO...
Hibernate是一个强大的对象关系映射(ORM)框架,它在Java应用程序中起到了桥梁的作用,使得开发者可以使用面向对象的方式来操作数据库。这个压缩包“Hibernate--jar”包含了一系列的Hibernate框架核心库,是构建...
2. 安装与配置:开始学习Hibernate之前,需要将其添加到项目依赖中,通常是通过Maven或Gradle。配置包括创建`hibernate.cfg.xml`文件,定义数据库连接参数,如URL、用户名、密码以及JDBC驱动等。 3. 实体类和注解:...
Spring的Hibernate支持还包括事务模板和HibernateTemplate,它们可以帮助开发者避免直接与SessionFactory和Session交互,从而减少代码中的错误和重复。 Spring的DAO(Data Access Object)支持为基于Hibernate的...
2. **SessionFactory和Session**:在Hibernate中,`SessionFactory`是线程安全的,用于创建`Session`对象。`Session`是与数据库交互的主要接口,提供了对持久化对象的操作。`BaseDAO`一般会包含一个`SessionFactory`...
2. **实体(Entity)**:在Hibernate中,实体代表数据库中的表,它是业务逻辑中的主要对象。每个实体对应一个Java类,类中的属性与表的列相对应。 3. **持久化类(Persistent Class)**:持久化类是被Hibernate管理...
在"Struts 2 + Hibernate 3 实现用户的增删改查"项目中,我们将探讨以下几个核心知识点: 1. **Struts 2 框架**: - **Action类**:Struts 2 的核心组件,负责处理用户请求,通常对应于业务逻辑。 - **配置文件**...
《Hibernate深度探索——基于PDF学习文档》 ...通过深入学习和实践这些知识点,开发者不仅能熟练掌握Hibernate框架,还能在实际项目中灵活运用,提高开发效率,减少错误,从而提升整体项目的质量和稳定性。