`
t8500071
  • 浏览: 112910 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用hibernate2的时候出现session中对象重复错误

阅读更多

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操作持久化对象

    Hibernate的核心在于提供对象-关系映射(ORM)服务,使得开发者能够以面向对象的方式来管理和操作数据库中的数据,从而减少了直接使用JDBC进行数据操作时的复杂性和错误。 为什么需要Hibernate? 在传统的JDBC编程中...

    Hibernate逍遥游记 .pdf

    不过,由于文本中的网址重复出现,且重复信息过多,可以推断OCR扫描文档时可能存在识别错误或重复扫描,导致输出了大量相同内容。在实际使用时,应当忽略这些重复信息,专注于有效的知识点学习。

    hibernate中文API

    - SessionFactory:是Hibernate的核心,负责生成Session对象,是线程安全的。 - Session:代表一次数据库会话,执行CRUD操作的主要接口。 - Transaction:处理数据库事务,确保数据的一致性。 - Query:提供查询...

    struts2整合hibernate

    Struts2和Hibernate是两种非常重要的Java开源框架,它们分别在Web应用的MVC(Model-View-Controller)架构和对象关系映射(ORM)领域发挥着关键作用。这篇文章将深入探讨如何整合这两个框架,以及整合过程中涉及的...

    hibernate操作

    在本文中,我们将深入探讨如何在MyEclipse中配置并使用Hibernate进行数据库操作。Hibernate是一个强大的对象关系映射(ORM)...通过这种方式,你可以轻松地在MyEclipse中使用Hibernate来管理数据库操作,简化开发过程。

    hibernate中文文档

    Hibernate是一款强大的Java持久化框架,它为Java开发者提供了一种对象关系映射(ORM)解决方案,使得在Java应用中管理数据库变得更加便捷。本中文文档旨在详细介绍Hibernate的核心概念、配置、使用方法以及最佳实践。 ...

    hibernate错误解决方案

    在使用Hibernate框架进行开发的过程中,经常会遇到各种各样的异常问题。这些问题可能会导致程序无法正常运行,甚至影响到系统的稳定性。本文将针对几个常见的Hibernate错误进行深入分析,并提供相应的解决方法。这些...

    Hibernate、Spring和Struts工作原理及使用理由

    2. **解析映射信息,创建SessionFactory**:映射信息通常在.hbm.xml文件中定义,SessionFactory是线程安全的,用于创建Session实例。 3. **打开Session**:Session是Hibernate的主要工作接口,它负责与数据库交互,...

    Hibernate练习题

    - 在Hibernate中,当Session关闭时,所有与之关联的持久化对象变为游离状态。在这个例子中,Customer对象在line6变为游离状态,因为Session在这一行被关闭。 13. 优化Hibernate查询性能: - 使用缓存机制,如一级...

    Hibernate通用数据库操作方法

    首先,通过 `HibernateSessionFactory.currentSession()` 获取当前的 Session 实例,这是 Hibernate 中处理对象与数据库交互的基本单元。然后,开启一个新的事务 `t = session.beginTransaction()`。接下来,调用 `...

    使用Maven Hibernate5 之反向工程

    在Java Web开发中,Maven、Hibernate5以及反向...通过这个实践,开发者不仅可以学习到如何使用Maven和Hibernate5,还能理解反向工程在实际项目中的应用,提高开发效率,同时降低了因为手动创建实体类而可能导致的错误。

    Hibernate的通用dao

    通过使用Hibernate,开发者可以使用Java对象而不是SQL语句进行数据操作,提高开发效率并减少错误。 **二、DAO设计模式** DAO设计模式是软件工程中常见的一个模式,主要用于隔离业务逻辑层与数据存储层的交互。DAO...

    hibernate框架的jar包

    Hibernate是一个强大的对象关系映射(ORM)框架,它在Java应用程序中起到了桥梁的作用,使得开发者可以使用面向对象的方式来操作数据库。这个压缩包“Hibernate--jar”包含了一系列的Hibernate框架核心库,是构建...

    《精通Hibernate》学习-对象关系映射基础.zip

    2. 安装与配置:开始学习Hibernate之前,需要将其添加到项目依赖中,通常是通过Maven或Gradle。配置包括创建`hibernate.cfg.xml`文件,定义数据库连接参数,如URL、用户名、密码以及JDBC驱动等。 3. 实体类和注解:...

    spring2.5 hibernate api

    Spring的Hibernate支持还包括事务模板和HibernateTemplate,它们可以帮助开发者避免直接与SessionFactory和Session交互,从而减少代码中的错误和重复。 Spring的DAO(Data Access Object)支持为基于Hibernate的...

    hibernate>>BaseDAO

    2. **SessionFactory和Session**:在Hibernate中,`SessionFactory`是线程安全的,用于创建`Session`对象。`Session`是与数据库交互的主要接口,提供了对持久化对象的操作。`BaseDAO`一般会包含一个`SessionFactory`...

    Hibernate 5 用户手册 中文版(带目录)

    2. **实体(Entity)**:在Hibernate中,实体代表数据库中的表,它是业务逻辑中的主要对象。每个实体对应一个Java类,类中的属性与表的列相对应。 3. **持久化类(Persistent Class)**:持久化类是被Hibernate管理...

    struts 2 + hibernate 3 实现用户的增删改查

    在"Struts 2 + Hibernate 3 实现用户的增删改查"项目中,我们将探讨以下几个核心知识点: 1. **Struts 2 框架**: - **Action类**:Struts 2 的核心组件,负责处理用户请求,通常对应于业务逻辑。 - **配置文件**...

    10_hibernate.rar

    《Hibernate深度探索——基于PDF学习文档》 ...通过深入学习和实践这些知识点,开发者不仅能熟练掌握Hibernate框架,还能在实际项目中灵活运用,提高开发效率,减少错误,从而提升整体项目的质量和稳定性。

Global site tag (gtag.js) - Google Analytics