java session重复登录_Java开发网 - Hibernate:session中对象重复问题的解决方法(原创)...
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中对象重复问题的解决方法(原创)...相关推荐
- java删除有序数组中的重复元素_java去除已排序数组中的重复元素
题目描述 给定一个已排序的数组,去除数组中的重复元素,只保留一个重复的元素,并且返回新的数组长度. 要求: 不要给数组分配额外的空间,你必须使用常量的内存大小进行原地操作. 例如: 给出数组A=[1, ...
- java获取系统时间差_java获取系统时间与实际相差8小时的解决方法
Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.u ...
- java替换换行符_Java的replace替换字符串中的回车换行符的方法
Java的replace替换字符串中的回车换行符的方法 导语:Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大 ...
- java工作流 数据库设计_Java开发网
于 2007-12-06 16:10 基于JGRAHP的工作流模型设计器 JWFD v0.9 comsci@163.com QQ: 784092877 群:7428804 简介 JDK1.4以上 运行 ...
- java操作mysql临时表_Java开发网 - 系统临时表使用问题
Posted by:hzxl Posted on:2003-08-31 18:14 系统临时表的使用: 在一些程序中,我们需要一些仅仅在程序中使用的临时表,但是程序结束后就不再使用,数据库系统对这些应 ...
- java禁止ie后退_Java开发网 - 【讨论】html页面禁用右键,浏览器后退、刷新,以及相应快捷键...
Posted by:lisliefor Posted on:2006-06-15 21:36 前些天交付一个系统时,客户提出新要求回车等同于Tap键的功能,并能提交表单:禁用鼠标右键:禁用浏览器后退. ...
- java获取http文件大小_Java开发网 - 关于通过HTTPUrlConnection获取一个文件的大小?...
于 2005-01-11 11:12 例如有个文件http://127.0.0.1/tester/a.zip 我需要通过程序把它下载到本地来,这个没有问题 但是我想现实一个下载的进度 所以,就必须先知 ...
- 登录onedrive显示无法连接服务器,Win10打不开OneDrive提示“连接到onedrive时出现问题”解决方法...
我们在使用Win10系统的过程中,难免都会出现一些问题,如果您遇到OneDrive打不开,这时OneDrive会显示灰色的状态,我们双击打开的话,系统会提示:"连接到onedrive时出现问 ...
- excel如何晒出重复数据_3秒找出Excel中的重复数据,年底数据统计用得上,赶紧码住...
职场人经常会碰到数据核对的任务,特别是在月底和年末,老板索要数据统计结果时,你总得检查一遍再交上去吧. 如果你对 Excel 中的基本功能不熟悉,就很可能碰到和这位妹子一样的难题: 遇到上面这种情况该 ...
- java开发中遇到的问题及解决方法(持续更新)
java开发中遇到的问题及解决方法(持续更新) 参考文章: (1)java开发中遇到的问题及解决方法(持续更新) (2)https://www.cnblogs.com/LiuYanYGZ/p/6112 ...
最新文章
- 【怒怼老乔】苹果手机ios系统居然特喵的不支持日期yyyy-MM-dd HH:mm:ss.ms,只支持 yyyy/MM/dd HH:mm:ss
- 瞭望丨光子芯片能否让中国“换道超车”
- 分析周鸿祎的安全卫士360[转]
- CSS3实例教程:border-image属性实例讲解
- python / 解决 pyinstaller 打包后运行时提示找不到模块的问题
- poj1274 最大二分匹配
- 过程(栈帧结构是干货)
- hive简介(大数据技术)
- 分布式系统中的领导选举
- 交换机虚拟化和堆叠的区别_交换机级联与堆叠有何区别
- UML 结构图之包图 总结
- KEIL中遇到WARNING: MULTIPLE CALL TO SEGMENT的解决方法
- 常见python爬虫框架_python的爬虫框架有哪些
- 制作一个网站多少钱?2018最新网站制作明细表
- python whl文件_python whl是什么文件
- python 中英文 分离_利用Python将文本中的中英文分离方法
- servlet实现统计网站访问量
- 南京地图njmaps使用,以公众版为例
- 计算机到点就有音乐怎么清除缓存垃圾,如何自动清理网易音乐的缓存
- 计算机C语言好学吗?要是想自学应该怎么办?大学挂科赶紧恶补!