zoukankan      html  css  js  c++  java
  • 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方法则是在返回对象时立即从数据库中执行对应查询,将返回记录封装进对应实体中

  • 相关阅读:
    Markdown学习
    二叉树的最近公共祖先
    javaCompiler简析
    自定义类加载器
    聚合和组合的区别
    拓扑排序
    C++ map和unordered_map
    静态文件加载路径
    文件上传
    jackson
  • 原文地址:https://www.cnblogs.com/toDjlPersonnalBlog/p/4246926.html
Copyright © 2011-2022 走看看