一开始报错NonUniqueObjectException
Session session = null;
Transaction tr = null;
try {
session = HibernateUtil.getSession();
tr = session.beginTransaction();
tr.begin();
session.update(user);
session.flush();
tr.commit();
} catch (Exception e){
if (tr != null) {
tr.rollback();
}
logger.error("DB save error :" + e);
e.printStackTrace();
throw e;
} finally {
session.clear();
}
代码如上图所示
在网上经过了解,发现要用到merge结果也是改了下
Session session = null;
Transaction tr = null;
try {
session = HibernateUtil.getSession();
tr = session.beginTransaction();
tr.begin();
session.merge(user);
session.flush();
tr.commit();
} catch (Exception e){
if (tr != null) {
tr.rollback();
}
logger.error("DB save error :" + e);
e.printStackTrace();
throw e;
} finally {
session.clear();
}
在之后仍旧是报错
仔细读了下我的代码发现,user对象中还另外含有一个organ对象,经报错提示,是organ already exist ,所以,果断在merge前再加了一次clear()。如下图所示
Session session = null;
Transaction tr = null;
try {
session = HibernateUtil.getSession();
tr = session.beginTransaction();
tr.begin();
session.clear();
session.merge(user);
session.flush();
tr.commit();
} catch (Exception e){
if (tr != null) {
tr.rollback();
}
logger.error("DB save error :" + e);
e.printStackTrace();
throw e;
} finally {
session.clear();
}
完美解决问题
总结
在网上查了好久,无论怎样改都不行,后通过看源码,发现session中存在的entity对象存的并不是user对象而是user对象中的organ对象,organ对象在批量执行update方法时,finally中的clear也是可以进行清空的,但为什么不能清空user里organ对象的缓存呢。经试验发现只要是有新user对象时,session中的entity便会新增organ对象,也就是说不管执行或不执行update方法。都会向session中新增entity对象的值,所以当new user时不执行update后,下一次执行update时就会发现session中其实已经存在了相同的entity对象的值了。在merge前添加clear是为了清空entity中的值。以保证本次执行session中没有重复项。