Hibernate之Session merge与update方法

项目中使用Hibernate时报了一个异常:org.hibernate.NonUniqueObjectException;经从网上查找资料得知,同一个session里面有了两个相同标识但是是不同实体.即2个不同的对象关联到了同一个标志位。

验证代码如下:

@Test
	public void add() {

		Session session = SessionFactory.getSession();
		Transaction tr = session.beginTransaction();
		// ----------------------------------------------
		Person p1 = (Person) session.get(Person.class, 0);
		
		Person p2 = new Person();
		p2.setId(0);
		p2.setName("username" + p1.getName());
		
		session.update(p2);
		// ----------------------------------------------
		tr.commit();
		SessionFactory.closeSession();

	}

执行报出异常:

Hibernate之Session merge与update方法_第1张图片

解决方案:使用session.merge()方法代替update()方法。

 

当调用update或saveOrUpdate操作时,抛出了异常信息“org.hibernate.NonUniqueObjectException”,不是“独一无二”的对象。为什么会抛出这个错误呢?上面的person2调用了get方法,所以person2是一个持久化对象,当在session还没有关闭的时候对person2做的任何修改,都会保存到数据库中;person要执行更新操作,但由于它是一个脱管对象,那么就需要跟数据库重新取得联系,需要从数据库获取数据,hibernate会查找当前是否关于这个对象的副本,刚好有个person2(但又不知person2是否修改了且保存到了数据库),与其保存这可能没用的数据,还不如直接报错来得直接。这里调用update和saveOrUpdate类似。

        还有update与merge的一点不同是:update是直接发出“sql update”语句,而merge会先发出“sql select”语句,如果没有查询到结果,那么执行save操作,如果查询到相关结果,则判断对应字段是否有发生改变,如果改变了,则发出“sql update”语句,否则什么也不做。这一方面,merge就和saveOrUpdate相同。

 

参考文章:

    http://blog.csdn.net/zhongxianyao/article/details/12294011

    http://www.simplecodestuffs.com/difference-between-update-and-merge-methods-in-hibernate/

你可能感兴趣的:(Java,Hibernate3.x)