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