`
gjs_ht
  • 浏览: 8691 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate的NonUniqueObjectException错误处理

阅读更多

 

具体描述:A different object with the same identifier value was already associated...问题的处理 

网上的解释: 

hibernate的session缓存之前处理过的数据,比如查询某些信息如User对象,当第二次查询时,从缓存中取出来就可以了。也正是因为session中缓存的存在,导致处理不当时,会出现问题。比如如下场景: 

  1. 查出来来一个User对象,id1,此时用户再new一个id1的用户(id是用户的主键),执行save操作就会导致NonUniqueObjectException的异常,因为主键值相同,但是引用的对象不同。

  2. 执行更新的过程中也可能存在这样的问题,如下面的程序中(来自于互联网,未验证):

      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);  

  

除此之外,网上还给出了解决办法:

  1. session.evict(objPO);或者在update之前session.clear();,清除缓存,或者调用evict方法,将当前对象设置为detached的状态

  2. sessionmerge方法,但是这个方法可能逻辑不对。

----------------------------------------------------分割线,上面来自互联网----------------------------

我今天说的是另一种情形,也是我犯的一个错误。 

一个人拥有多个账户的情形 

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的时候,发现at1at2中的id都已经被赋值了,且都是为0,因此出现了上述报错。

解决的方法也很简单,就是AccountTestidlong变为Long

分享到:
评论

相关推荐

    详解Hibernate事务处理机制

    ### 详解Hibernate事务处理机制 #### 一、引言 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了数据持久化的复杂性,还提供了一系列强大的功能来支持高效的...

    Hibernate做的留言板

    【标题】"Hibernate做的留言板" 是一个基于Java的Web应用程序,使用了流行的持久化框架Hibernate来处理数据库交互。这个项目提供了完整的源代码,方便开发者直接在Eclipse集成开发环境中运行和学习。它不仅是一个...

    使用struts、hibernate进行分页处理

    使用struts、hibernate进行分页处理 使用struts、hibernate进行分页处理 使用struts、hibernate进行分页处理 使用struts、hibernate进行分页处理 使用struts、hibernate进行分页处理

    Hibernate的事务处理机制和flush方法的用法.docx

    在本文中,我们将深入探讨Hibernate的事务处理机制以及`flush`方法的用法,并分析为何在某些场景下会出现特定的异常。 首先,我们需要了解Hibernate中的事务处理。在Java应用中,事务通常与SessionFactory和Session...

    Hibernate下数据批量处理解决方案

    在Java开发中,尤其是涉及到大数据量的处理时,人们往往会质疑ORM框架,如Hibernate,是否适合进行批量数据操作。然而,实际上,通过适当的技术手段,我们可以有效地解决Hibernate在批量处理时可能出现的性能问题。...

    Hibernate入门到精通

    Hibernate 的主要特点是:支持多种数据库管理系统、提供了高效的数据访问机制、支持事务处理和缓存机制等。 Hibernate 环境搭建 要使用 Hibernate,首先需要搭建 Hibernate 的开发环境。下面是 Hibernate 环境搭建...

    jackson-datatype-hibernate, 用于处理Hibernate的Jackson JSON处理器模块( http,Add.zip

    jackson-datatype-hibernate, 用于处理Hibernate的Jackson JSON处理器模块( http,Add 构建 Jackson 模块( jar ) 以支持JSON序列化和反序列化 Hibernate ( http://hibernate.org ) 特定数据类型和属性,特别是延迟...

    hibernate aip hibernate aip

    9. **错误处理和日志记录**:理解Hibernate常见的错误和异常,如 detached entity passed to persist 等,并配置合适的日志系统,如Log4j或SLF4J,以便追踪应用运行状态。 总的来说,Hibernate AIP涵盖了从项目初始...

    kingbaseV8 hibernate jdbc 驱动

    KingbaseV8的方言文件可以帮助Hibernate理解和处理KingbaseV8特有的SQL语法和特性。 总结来说,这个压缩包包含了不同版本的Hibernate核心库以及可能的KingbaseV8 JDBC驱动和方言实现,这些组件使得开发者能够利用...

    hibernate,struts,spring 常见错误信息

    一、Hibernate错误 Hibernate是Java持久层框架,它简化了数据库操作。常见的错误包括: 1. **配置错误**:如XML配置文件中的实体映射错误、数据源配置错误等,可能导致SessionFactory无法创建。 2. **SQL异常**:...

    在Java SE中使用Hibernate处理数据

    另一个挑战是错误处理和日志记录。在没有容器的日志框架支持时,需要引入如Log4j这样的日志库来记录执行过程中的信息和异常。 最后,对于复杂的数据模型,如多表关联和事务处理,Java SE应用中的Hibernate使用可能...

    Beginning Hibernate: For Hibernate 5

    - **简化开发**: Hibernate 大大减少了开发者处理复杂 SQL 查询的工作量,使得数据库操作更加直观。 - **提高效率**: 通过缓存机制、懒加载等技术,Hibernate 可以有效提高应用程序性能。 - **增强可维护性**: 采用 ...

    Hibernate,hibernate笔记

    如果遇到错误,例如配置错误导致browse无法选择正确的项目目录,可能需要手动修改`.project`文件的natures部分,确保包含Hibernate的nature。 总的来说,Hibernate是Java开发中的重要工具,它通过ORM解决了数据库...

    Hibernate错误及解决办法集合

    ### Hibernate常见错误及解决办法 #### 一、Nodefaultconstructorforentity 错误 **问题描述**:在使用Hibernate执行查询语句时,系统抛出`Nodefaultconstructorforentity`错误。 **可能原因**:该错误通常是由于...

    hibernate学习资料大全

    了解事务的ACID特性以及如何在Hibernate中处理事务,可以确保数据的一致性。 7. **一对多、多对一、多对多关联映射**: Hibernate 支持各种关联映射,如一对一、一对多、多对一和多对多。理解这些关联关系的建立和...

    hibernate3.zip 包含hibernate3.jar

    11. **事件监听器**:Hibernate允许注册事件监听器,对持久化对象的各种操作(如保存、更新、删除等)进行拦截和自定义处理。 以上就是`hibernate3.jar`中所包含的关键知识点。理解并熟练使用这些概念,可以帮助...

    hibernate3 hibernate3

    2. 支持复杂查询:除了HQL和Criteria API,Hibernate还支持原生SQL查询,以处理更复杂的查询需求。 3. 数据缓存:通过二级缓存机制,提高数据访问效率,减少对数据库的直接访问。 4. 支持事务:提供了事务管理和...

    hibernate3全部jar包:hibernate3.jar.zip 下载

    此外,Hibernate3提供了强大的关联映射功能,如一对一、一对多、多对一和多对多关系,使得处理复杂的数据库关系变得简单。 总的来说,Hibernate3是一个功能强大的ORM工具,简化了Java应用程序与数据库的交互,提高...

    Hibernate-extensions 完整安装包

    总结来说,Hibernate-Extensions是Hibernate的一个强大补充,它扩展了ORM的功能边界,使开发者能够更高效、更灵活地处理数据库操作。无论你是初学者还是经验丰富的开发者,这个完整的安装包都值得你拥有,因为它将为...

Global site tag (gtag.js) - Google Analytics