Posted by:anray

Posted on:2004-08-01 20:13

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

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

user2.setName("anray2");

session.update(user1);

session.update(user2);

这样就会出现上面的异常

看上去上面的代码有点傻,我们编程中不可能出现这样的情况。

但是有一种情况是经常用到的,就是写一个专门的类来管理sessionFactory和session,如下

/*

* Examination System version 0.1

* Data persist layer(Using Hibernate 2.1.2)

* Created on 2004-4-9 11:58:12

*/

package bts.hibernate;

/**

* @author Anray

*/

import net.sf.hibernate.*;

import net.sf.hibernate.cfg.*;

public class HibernateUse

{

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

/*

* Examination System version 0.1

* Data persist layer(Using Hibernate 2.1.2)

* Created on 2004-4-9 11:58:12

*/

package bts.hibernate;

/**

* @author Anray

*/

import net.sf.hibernate.*;

import net.sf.hibernate.cfg.*;

public class HibernateUse

{

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.clear();

session1.update(object);

transaction1.commit();

}catch(HibernateException ex){

if(transaction1!=null)transaction1.rollback();

closeSession();

throw ex;

}

}

}

第一次写东西,大家多指教

java session重复登录_Java开发网 - Hibernate:session中对象重复问题的解决方法(原创)...相关推荐

  1. java删除有序数组中的重复元素_java去除已排序数组中的重复元素

    题目描述 给定一个已排序的数组,去除数组中的重复元素,只保留一个重复的元素,并且返回新的数组长度. 要求: 不要给数组分配额外的空间,你必须使用常量的内存大小进行原地操作. 例如: 给出数组A=[1, ...

  2. java获取系统时间差_java获取系统时间与实际相差8小时的解决方法

    Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.u ...

  3. java替换换行符_Java的replace替换字符串中的回车换行符的方法

    Java的replace替换字符串中的回车换行符的方法 导语:Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大 ...

  4. java工作流 数据库设计_Java开发网

    于 2007-12-06 16:10 基于JGRAHP的工作流模型设计器 JWFD v0.9 comsci@163.com QQ: 784092877 群:7428804 简介 JDK1.4以上 运行 ...

  5. java操作mysql临时表_Java开发网 - 系统临时表使用问题

    Posted by:hzxl Posted on:2003-08-31 18:14 系统临时表的使用: 在一些程序中,我们需要一些仅仅在程序中使用的临时表,但是程序结束后就不再使用,数据库系统对这些应 ...

  6. java禁止ie后退_Java开发网 - 【讨论】html页面禁用右键,浏览器后退、刷新,以及相应快捷键...

    Posted by:lisliefor Posted on:2006-06-15 21:36 前些天交付一个系统时,客户提出新要求回车等同于Tap键的功能,并能提交表单:禁用鼠标右键:禁用浏览器后退. ...

  7. java获取http文件大小_Java开发网 - 关于通过HTTPUrlConnection获取一个文件的大小?...

    于 2005-01-11 11:12 例如有个文件http://127.0.0.1/tester/a.zip 我需要通过程序把它下载到本地来,这个没有问题 但是我想现实一个下载的进度 所以,就必须先知 ...

  8. 登录onedrive显示无法连接服务器,Win10打不开OneDrive提示“连接到onedrive时出现问题”解决方法...

    我们在使用Win10系统的过程中,难免都会出现一些问题,如果您遇到OneDrive打不开,这时OneDrive会显示灰色的状态,我们双击打开的话,系统会提示:"连接到onedrive时出现问 ...

  9. excel如何晒出重复数据_3秒找出Excel中的重复数据,年底数据统计用得上,赶紧码住...

    职场人经常会碰到数据核对的任务,特别是在月底和年末,老板索要数据统计结果时,你总得检查一遍再交上去吧. 如果你对 Excel 中的基本功能不熟悉,就很可能碰到和这位妹子一样的难题: 遇到上面这种情况该 ...

  10. java开发中遇到的问题及解决方法(持续更新)

    java开发中遇到的问题及解决方法(持续更新) 参考文章: (1)java开发中遇到的问题及解决方法(持续更新) (2)https://www.cnblogs.com/LiuYanYGZ/p/6112 ...

最新文章

  1. 【怒怼老乔】苹果手机ios系统居然特喵的不支持日期yyyy-MM-dd HH:mm:ss.ms,只支持 yyyy/MM/dd HH:mm:ss
  2. 瞭望丨光子芯片能否让中国“换道超车”
  3. 分析周鸿祎的安全卫士360[转]
  4. CSS3实例教程:border-image属性实例讲解
  5. python / 解决 pyinstaller 打包后运行时提示找不到模块的问题
  6. poj1274 最大二分匹配
  7. 过程(栈帧结构是干货)
  8. hive简介(大数据技术)
  9. 分布式系统中的领导选举
  10. 交换机虚拟化和堆叠的区别_交换机级联与堆叠有何区别
  11. UML 结构图之包图 总结
  12. KEIL中遇到WARNING: MULTIPLE CALL TO SEGMENT的解决方法
  13. 常见python爬虫框架_python的爬虫框架有哪些
  14. 制作一个网站多少钱?2018最新网站制作明细表
  15. python whl文件_python whl是什么文件
  16. python 中英文 分离_利用Python将文本中的中英文分离方法
  17. servlet实现统计网站访问量
  18. 南京地图njmaps使用,以公众版为例
  19. 计算机到点就有音乐怎么清除缓存垃圾,如何自动清理网易音乐的缓存
  20. 计算机C语言好学吗?要是想自学应该怎么办?大学挂科赶紧恶补!

热门文章

  1. ios开发之--UITextField光标右移
  2. ORM正向和反向查询
  3. jQuery动画之显示隐藏动画
  4. 实例学习SSIS(三)--使用包配置
  5. 利用linux内核代码玩转c链表
  6. fence_ilo can't connect by ssl, since CentOS 5.8 lack pyOpenSSL
  7. 微信小程序,video 全屏视屏展示,广告样式
  8. DBeaver 7.2.4 发布,可视化数据库管理平台
  9. api下载文件三种方式
  10. Layer success 层弹出后的成功回调方法