load方法VSget方法
- 假如数据库不存在该对象,load会抛异常而get会返回null
- load方法默认采用延迟加载策略,只获取对象引用,访问到属性时才会加载对象属性。因此删除对象时多采用load方法,访问对象时多采用get。
saveOrUpdate方法
- 对象存在时采用update,否则采用save
merge方法
合并对象,解决对象不唯一问题
/** * 把主键为1的班级改名为08计本4 */ @Test public void testMergeClass() { Session session1=sessionFactory.openSession(); session1.beginTransaction(); Class c1=(Class)session1.get(Class.class, Long.valueOf(1)); session1.getTransaction().commit(); session1.close(); Session session2=sessionFactory.openSession(); session2.beginTransaction(); Class c2=(Class)session2.get(Class.class, Long.valueOf(1)); c1.setName("08计本4"); //如果用session.update(c1)的话,会报错:对象不唯一,缓存中存在不止一个该对象->org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [com.java1234.model.Class#1] //因为上面session2.get之后session2中就有了一个主键为1的对象,而引用这个对象的是c2,c1就相当于另外一个主键为1的对象,但是它已不在会话中,要用它来更新c2关联的数据就错乱了。如果c2的管理的不是id为1的对象那就可以update(c1),但是现在同时有两个对象的主键是1,用merge就意味着这两个对象的更新操作都会被合并到同一条记录上。 //换成save的话则是新建一条记录,因为c1的事务已经关了,再保存c1就相当于保存一个新对象,若没关的话那就是修改一个存在的对象,就变成更新原有记录了 session2.merge(c1); session2.getTransaction().commit(); session2.close(); }
代码实例
- eclipse->HibernateFunction