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

  • 相关阅读:
    sqlite 修改 id 自增值
    欧拉图与哈密顿图12:22
    nps 配置 vnc内网穿透
    0 范数、1 范数、2 范数有什么区别?
    相关测试
    golang学习笔记---channel(通道)
    golang学习笔记---pflag包
    Nginx+Keepalived配置Nginx自动启动和7*24不间断服务
    Keepalived+Nginx双机主备配置实践
    虚拟机中使用域名通过宿主window访问
  • 原文地址:https://www.cnblogs.com/toDjlPersonnalBlog/p/4246926.html
Copyright © 2020-2023  润新知