您的位置:首页 > 其它

在通过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里面有了两个相同标识但是是不同实体

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


这下终于是没问题了,亲测。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate session