在通过hibernate进行删除操作时遇到的一个异常
2016-09-05 20:01
555 查看
源代码是这样的,本来想通过一个name属性来删除整个User对象,没想到却发生了这个错误:a different object with the same identifier value was already associated with the session: [com.DaoAndEntity.User#111]
在hibernate中同一个session里面有了两个相同标识但是是不同实体
后来才发现原来是session中存在了两个id相同的对象:
这里面通过name获取到了一个user对象
而这里面又new了一个user对象,而且这个user对象的内容是和上面一个一模一样的,因为第二个是通过的一个的id取出来的。。。这时候执行删除操作hibernate就不知道该怎么办了,因为hibernate在缓存中发现两个user的id都一样,两个不同的对象却有相同的id,他就傻了
所以第二段通过id取对象就是多余的,所以直接改成这样
。。。。。做到这里我竟然就天真的以为大功告成了,结果一运行发现不报错了,delete语句也执行力,但数据库里面就是没删除,,,具体为什么我也还不清楚,于是我就干脆用hql语句删了,代码如下,还是先找到id然后,然后通过id删
这下终于是没问题了,亲测。
在hibernate中同一个session里面有了两个相同标识但是是不同实体
public void delete(String name) { // 1.第一步:读取hiber.cfg.xml文件 Configuration cfg = new Configuration().configure(); // 2.第二步:建立sessionfactory SessionFactory factory = cfg.buildSessionFactory(); // 3.第三步:取得session, Session session = null; session = factory.openSession(); Transaction t = null; try{ // 4.第四步:开启事务 t = session.beginTransaction(); List<User> list = null; list = (List<User>)HibernateSessionFactory.getSession().createQuery("select u from User u where userNickname like ?") .setParameter(0, name) .list(); User user = (User) session.get(User.class, list.get(0).getUserId()); getSession().delete(user); t.commit(); log.debug("delete successful"); } catch (RuntimeException re) { log.error("delete failed", re); throw re; }finally{ session.close(); } }
后来才发现原来是session中存在了两个id相同的对象:
这里面通过name获取到了一个user对象
list = (List<User>)HibernateSessionFactory.getSession().createQuery("select u from User u where userNickname like ?") .setParameter(0, name) .list();
而这里面又new了一个user对象,而且这个user对象的内容是和上面一个一模一样的,因为第二个是通过的一个的id取出来的。。。这时候执行删除操作hibernate就不知道该怎么办了,因为hibernate在缓存中发现两个user的id都一样,两个不同的对象却有相同的id,他就傻了
User user = (User) session.get(User.class, list.get(0).getUserId());
所以第二段通过id取对象就是多余的,所以直接改成这样
public void delete(String name) { // 1.第一步:读取hiber.cfg.xml文件 Configuration cfg = new Configuration().configure(); // 2.第二步:建立sessionfactory SessionFactory factory = cfg.buildSessionFactory(); // 3.第三步:取得session, Session session = null; session = factory.openSession(); Transaction t = null; try{ // 4.第四步:开启事务 t = session.beginTransaction(); List<User> list = null; list = (List<User>)HibernateSessionFactory.getSession().createQuery("select u from User u where userNickname like ?") .setParameter(0, name) .list(); getSession().delete(list.get(0)); t.commit(); log.debug("delete successful"); } catch (RuntimeException re) { log.error("delete failed", re); throw re; }finally{ session.close(); } }
。。。。。做到这里我竟然就天真的以为大功告成了,结果一运行发现不报错了,delete语句也执行力,但数据库里面就是没删除,,,具体为什么我也还不清楚,于是我就干脆用hql语句删了,代码如下,还是先找到id然后,然后通过id删
try{ List<User> list = null; list = (List<User>) HibernateSessionFactory.getSession().createQuery("select u from User u where userNickname like ?") .setParameter(0, name).list(); String hql="delete User as u where u.userId=?"; Query query=session.createQuery(hql); query.setInteger(0,list.get(0).getUserId()); query.executeUpdate(); session.beginTransaction().commit(); log.debug("delete successful"); }
这下终于是没问题了,亲测。
相关文章推荐
- Angularjs 跨域请求
- kindeditor 批量上传 上传失败 thinkphp swfupload session
- 杰奇登录后的东西都是在session里面的
- ASP中SESSION无法保存问题的解决办法
- Oracle中的Connect/session和process的区别及关系介绍
- Node.js编程中客户端Session的使用详解
- 完美解决ajax访问遇到Session失效的问题
- 浅谈COOKIE和SESSION区别
- 解析PHP的session过期设置
- php中Session的生成机制、回收机制和存储机制探究
- PHP中session跨子域的三种实现方法
- php中将一个对象保存到Session中的方法
- 深入解析Session是否必须依赖Cookie
- 对比分析php中Cookie与Session的异同
- PHP Session机制简介及用法
- 新手菜鸟必读:session与cookie的区别
- 深入讲解PHP Session及如何保持其不过期的方法
- PHP Session变量不能传送到下一页的解决方法
- PHP中的session永不过期的解决思路及实现方法分享