`
fanjf
  • 浏览: 330121 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

【异常】net.sf.hibernate.NonUniqueObjectException

    博客分类:
  • Java
 
阅读更多

net.sf.hibernate.NonUniqueObjectException:
a different object with the same identifier value was already associated with the session: .........

今天遇到这样的报错异常,网上搜索答案,以下的代码逻辑就会出现该异常:

SessionFactory sessionFactory= new Configuration().configure().buildSessionFactory();
Session session=sessionFactory.openSession();
User user1=new User("anray");
User user2=new User("anray");

//假设User是一个持久对象,有一个name属性
user1.setName("anray1");
user2.setName("anray2");
session.update(user1);
session.update(user2);

这样的代码,我们一般不可能会这样写,但有时,我们回写一个专门的类来管理sessionFactory和session,如:
package com.cpic.p17.pf.dao;

import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

/**
 * Hibernate DAO实现
 * @author fanjf
 * @date 2012-3-22
 */
public class HibernateDao {
    private static final SessionFactory sessionFactory;
    static {
        try {
            sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch (HibernateException ex) {
            throw new RuntimeException("Exception building SessionFactory: " + ex.getMessage(), ex);
        }
    }
   
    public static final ThreadLocal threadLocal = new ThreadLocal();
   
    /** 得到当前线程的session */
    public static final Session getSession() throws HibernateException {
        Session se = (Session) threadLocal.get();
        // Open a new Session, if this Thread has none yet
        if (se == null) {
            se = sessionFactory.openSession();
            threadLocal.set(se);
        }
        return se;
    }
   
    /** 关闭当前线程的session */
    public static final void closeSession() throws HibernateException {
        Session s = (Session) threadLocal.get();
        threadLocal.set(null);
        if (s != null)
            s.close();
    }
   
    /**
     *保存一个对象到数据库中,使用完后要自己调用closeSession()
     */
    public static void create(Object object) throws HibernateException {
        Session session1 = getSession();
        Transaction transaction1 = session1.beginTransaction();
        try {
            session1.save(object);
            transaction1.commit();
        } catch (HibernateException ex) {
            if (transaction1 != null)
                transaction1.rollback();
            closeSession();
            throw ex;
        }
    }
   
    /**
     *更新一个对象到数据库中,使用完后要自己调用closeSession()
     */
    public static void update(Object object) throws HibernateException {
        Session session1 = getSession();
        Transaction transaction1 = session1.beginTransaction();
        try {
            session1.update(object);
            transaction1.commit();
        } catch (HibernateException ex) {
            if (transaction1 != null)
                transaction1.rollback();
            closeSession();
            throw ex;
        }
    }
}

如果在web编程时用这个类的方法来更新一个user对象,在调用了HibernateUse.update(user)后,没有接着调用HibernateUse.closeSession(),其实为了节省资源也不提倡每次操作都调用HibernateUse.closeSession()关闭session;如果对相同的user对象进行又一次的更新时,碰巧容器又分配了同一个thread进行处理,那么得到的也是同一个session,这样就出现了上面的提到了问题,session里的两个user的识别id一样,但内容不一样。

为了解决这个问题可以在update前清空session(不是关闭,这样资源消耗比较少),修改后的公用类如下:
(就是在update()方法里添加了session1.clear();)
    /**
     *更新一个对象到数据库中,使用完后要自己调用closeSession()
     */
    public static void update(Object object) throws HibernateException {
        Session session1 = getSession();
        Transaction transaction1 = session1.beginTransaction();
        try {
            session1.clear();//更新对象前,清空session

            session1.update(object);
            transaction1.commit();
        } catch (HibernateException ex) {
            if (transaction1 != null)
                transaction1.rollback();
            closeSession();
            throw ex;
        }
    }

分享到:
评论

相关推荐

    JSON net.sf.json jar包

    `net.sf.json`是开源项目Apache软件基金会下的一个Java库,它提供了对JSON的支持,包括将Java对象转换为JSON格式以及将JSON字符串反序列化回Java对象的功能。 `net.sf.json`库主要包含以下功能点: 1. **JSON与...

    net.sf.json.JSONObject依赖jar

    net.sf.json.JSONObject是开源项目Apache Jakarta的一个子项目,提供了一个Java对象到JSON和JSON到Java对象的映射库。这个库允许开发者通过简单的API来操作JSON,从而实现数据的序列化和反序列化。 标题中的...

    net.sf.json依赖包

    `net.sf.json` 是一个广泛使用的开源JSON库,主要用于Java应用程序中处理JSON(JavaScript Object Notation)数据。JSON是一种轻量级的数据交换格式,它使得人和机器都能容易地读写数据,通常用于Web服务和客户端...

    net.sf.json需要的jar

    标题中的"net.sf.json需要的jar"指的是在Java开发中使用net.sf.json库时所需的依赖JAR文件。net.sf.json是开源项目,它提供了一系列的API来处理JSON(JavaScript Object Notation)数据格式,便于Java应用程序与JSON...

    net.sf.json2.4

    标题“net.sf.json2.4”指的是一个特定版本的JSON库,它是在Java环境中处理JSON数据的一个工具包。这个库的主要功能是帮助开发者在Java应用程序中生成和解析JSON(JavaScript Object Notation)字符串,这是一种轻量...

    Java中使用Json的net.sf.json包

    为了在Java中处理JSON数据,开发者通常会使用特定的库,如`net.sf.json`包,这是一个非常实用的JSON库,提供了丰富的功能来创建、解析和操作JSON对象。 `net.sf.json`库主要包含了两个核心类:`JSONObject`和`...

    net.sf.json.JSONObject Jar包下载

    "net.sf.json.JSONObject"是开源项目json-lib中的一个核心类,它提供了用于处理JSON对象的功能。这个Jar包是为Java开发者提供的一种便捷的方式来在Java对象与JSON数据之间进行转换。 JSONObject是net.sf.json库中的...

    net.sf.json.JSONObject相关jar包.zip

    标题 "net.sf.json.JSONObject相关jar包.zip" 指的是一个包含了与net.sf.json.JSONObject类库相关的Java档案(JAR)文件的压缩包。这个类库是开源项目JSON.org的一部分,用于在Java应用程序中处理JSON(JavaScript ...

    JSON(net.sf.json.JSONArray)需要的jar包

    在标题中提到的"JSON(net.sf.json.JSONArray)需要的jar包",是指为了在Java项目中使用`net.sf.json.JSONArray`以及相关的JSON类,你需要引入特定的jar包。`net.sf.json.JSONArray`是开源项目Apache licensed Json-...

    json net.sf.json

    6. **错误处理与兼容性**:`net.sf.json`库也考虑到了错误处理,当JSON数据不合法时,会抛出相应的异常。同时,它可能已经对不同的JSON标准和规范进行了兼容性处理,确保在不同环境下都能正常工作。 总的来说,`...

    net.sf.json.JsonObject需要的jar包

    在Java开发中,`net.sf.json.JSONObject` 是一个常用的JSON对象模型类,它来自于开源项目json-lib。这个库提供了一种方便的方式来处理JSON(JavaScript Object Notation)数据格式,允许我们在Java应用程序中创建、...

    net.sf.jadclipse_3.3.0.jar

    标题中的"net.sf.jadclipse_3.3.0.jar"是一个特定版本的JadClipse插件,属于Java反编译工具。JadClipse是集成开发环境(IDE)MyEclipse的一个扩展,用于查看和理解Java字节码,这对于调试、学习或逆向工程代码非常...

    net.sf.json.JSONObject依赖库.zip

    在Java开发中,`net.sf.json.JSONObject`是一个广泛使用的JSON处理库,特别是在Maven仓库中无法直接找到的情况下,开发者可能需要手动引入这个依赖库。`net.sf.json`库提供了对JSON(JavaScript Object Notation)...

    net.sf.json 及相关jar包

    在实际开发中,`net.sf.json`通常与其他Java相关的技术结合使用,例如Spring MVC框架、Struts2或Hibernate等,通过JSON进行前后端数据交互,提高应用程序的响应速度和用户体验。 标签中的“son相关包”可能是一个...

    net.sf.json.JSONObject实现Object对象与Json字符串的互转

    `net.sf.json.JSONObject`是开源库Apache Commons Lang中的一个类,它提供了解决Java对象与JSON字符串之间转换的功能。这篇博客文章"net.sf.json.JSONObject实现Object对象与Json字符串的互转"深入探讨了如何使用`...

    Json所需6个JAR包(net.sf.ezmorph.MorpherRegistry异常).rar

    Json所需6个JAR包(net.sf.ezmorph.MorpherRegistry异常),在json使用中我们经常会遇到net.sf.ezmorph.MorpherRegistry异常,这些jar包就是为了解决这个问题

    net.sf.json.JSONObject需要的jar包

    net.sf.json.JSONObject所需要的jar包 commons-beanutils-1.9.3.jar commons-collections-3.2.2 commons-lang-2.6 commons-logging-1.2 ezmorph-1.0.6 json-lib-2.4-jdk15

    net.sf.json jar包下载

    net.sf.json jar包包含了一下:可以用来解析json,具体操作可以看小编的博客。 commons-lang.jar commons-beanutils.jar commons-collections.jar commons-logging.jar ezmorph.jar json-lib-2.2.2-jdk15.jar

    Json所需6个JAR包(net.sf.ezmorph.MorpherRegistry异常

    `net.sf.ezmorph.MorpherRegistry`异常通常是由于Ezmorph库没有正确导入或者版本不匹配导致的。Ezmorph是一个Java库,它提供了一种方便的方式来转换对象的类型,这在处理JSON时可能会用到,特别是在将JSON字符串转换...

    net.sf.json.JSONObject 依赖的包

    `net.sf.json.JSONObject` 是一个广泛使用的开源JSON库,它为Java开发者提供了处理JSON对象的能力。这个库在很多项目中被用作与JSON数据交互的工具,尤其在那些不使用现代Java版本(如Java 8及以上)或者不依赖更...

Global site tag (gtag.js) - Google Analytics