关于org.hibernate.NonUniqueObjectException问题的解决

一开始报错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中没有重复项。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值