Hibernate中的Session 常用方法讲解

1,save()方法 将一个临时对象转变成持久化对象;
2,load()方法 VS get()方法
都是根据 OID 从数据库中加载一个持久化对象。
区别 1:假如数据库中不存在与 OID 对应的记录,Load()方法会抛出异常,而 get()方法返回 null;
区别 2:load 方法默认采用延迟加载策略,get 方法采用立即检索策略;

举例说明:

   @Test
    public void testLoadClass(){
        // Class c=(Class)session.load(Class.class, Long.valueOf(2));
        Class c=(Class)session.load(Class.class, Long.valueOf(1));//运行到这里c的值为null
        System.out.println(c.getStudents());  //延迟加载,这里c.getStudents()用到了c,c就会加载有值了
    }


2,update()方法 将一个游离对象转变为持久化对象;

举例说明:

@Test
    public void testUpdateClass(){
        Session session1=sessionFactory.openSession();
        session1.beginTransaction();
        Class c=(Class)session1.get(Class.class, Long.valueOf(1));
        session1.getTransaction().commit(); // 提交事务完之后,c变成游离对象
        session1.close();

        
        
        Session session2=sessionFactory.openSession();
        session2.beginTransaction();
        c.setName("08计算机本科2");
        session2.update(c);   update方法,c对象变成持久化对象
        session2.getTransaction().commit(); // 提交事务
        session2.close();
    }


3,saveOrUpdate()方法 包含了 save()和 update()方法;

举例说明:

@Test
    public void testSaveOrUpdateClass(){
        Session session1=sessionFactory.openSession();
        session1.beginTransaction();
        Class c=(Class)session1.get(Class.class, Long.valueOf(1));
        session1.getTransaction().commit(); // 提交事务
        session1.close();
        
        Session session2=sessionFactory.openSession();
        session2.beginTransaction();
        c.setName("08计算机本科3");
        
        Class c2=new Class();
        c2.setName("09计算机本科3");

      // c2临时对象,调用saveOrUpdate方法是插入09计算机本科3这条数据

      //c是游离对象,调用saveOrUpdate方法是执行更新操作,把oid为1的c对象的班级名更新为08计算机本科3


        session2.saveOrUpdate(c);
        session2.saveOrUpdate(c2);
        session2.getTransaction().commit(); // 提交事务
        session2.close();
    }


4,merge()方法,合并对象;

@Test
    public void testMergeClass(){
        Session session1=sessionFactory.openSession();
        session1.beginTransaction();
        Class c=(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));
        c.setName("08计算机本科4");
    
        session2.update(c);

        session2.getTransaction().commit(); // 提交事务
        session2.close();
    }

  当代码是 session2.update(c);会报错

Class c=(Class)session1.get(Class.class, Long.valueOf(1));

 Class c2=(Class)session2.get(Class.class, Long.valueOf(1));

session2缓存中已经有oid为1的对象c2,当更新c时会报错

解决办法: session2.update(c);这段代码改为 session2.merge(c); 用来合并session2缓存中的oid同为1的对象c和c2


5,delete()方法,删除对象;

采用延迟加载的方式获得要删除对象

@Test
    public void testDeleteStudent(){
        Student student=(Student)session.load(Student.class, Long.valueOf(1));
        session.delete(student);
    }

猜你喜欢

转载自blog.csdn.net/qq_40135955/article/details/89039997