hibernate学习5_session之load与get区别

hibernate从数据库中查询对应记录到java实体中时,一般可通过session.load或者session.get来完成

(1)load方法

    
    @Test
    public void testLoad(){
        Session session1 = sf.getCurrentSession();
        session1.beginTransaction();
        Student t = (Student) session1.load(Student.class, 45);
        System.out.println(t.getAge());
        session1.getTransaction().commit();
        
    }

在session关闭前使用返回对象时,hibernate加载正常

Hibernate: select student0_.id as id1_0_0_, student0_.age as age2_0_0_, student0_.name as name3_0_0_ from Student student0_ where student0_.id=?

如果将调用去掉。如下

    @Test
    public void testLoad(){
        Session session1 = sf.getCurrentSession();
        session1.beginTransaction();
        Student t = (Student) session1.load(Student.class, 45);
        //System.out.println(t.getAge());
        session1.getTransaction().commit();
        
    }

则hibernate执行上述程序时没有调用查询语句。

如果将调用放在session关闭之后,如下

    @Test
    public void testLoad(){
        Session session1 = sf.getCurrentSession();
        session1.beginTransaction();
        Student t = (Student) session1.load(Student.class, 45);
        session1.getTransaction().commit();
        System.out.println(t.getAge());
        
    }

则出现如下异常

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
.....

(2)get方法

    @Test
    public void testGet(){
        Session session1 = sf.getCurrentSession();
        session1.beginTransaction();
        Student t = (Student) session1.get(Student.class, 45);
        session1.getTransaction().commit();        
        System.out.println(t.getAge());
    }

get方法返回对应对象后,无论是在session关闭前调用或者关闭后调用,都能正常进行查询

Hibernate: select student0_.id as id1_0_0_, student0_.age as age2_0_0_, student0_.name as name3_0_0_ from Student student0_ where student0_.id=?

get方法返回对应对象后,即使不调用对象,依然能够正常查询。

 

综上:

(1)session的load方法返回对象时不是立即从数据库中执行查询,而是采用动态代理,在对象中属性被调用时hibernate再执行查询,即所谓的延迟加载。

     如果此时session关闭,则出现加载异常。

(2)session的get方法则是在返回对象时立即从数据库中执行对应查询,将返回记录封装进对应实体中

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。