zoukankan      html  css  js  c++  java
  • session get和load方法对比

    get测试代码如下:

    public class Test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
            SessionFactory sessionFactory=(SessionFactory) ac.getBean("sessionFactory");
            Session session=sessionFactory.openSession();
        
            User user1=(User) session.get(User.class, 3);
            System.out.println("-----------");
            System.out.println(user1);
    
        }
    
    }

    输出结果是:

    Hibernate:
    select
    user0_.id as id0_0_,
    user0_.name as name0_0_
    from
    mydb.user user0_
    where
    user0_.id=?
    -----------
    User [id=3, name=sara3]

    load测试代码

    public class Test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
            SessionFactory sessionFactory=(SessionFactory) ac.getBean("sessionFactory");
            Session session=sessionFactory.openSession();
    
            User user2=(User) session.load(User.class,2);
            System.out.println("********");
            System.out.println(user2);
            session.close();
    
        }
    
    }

    输出结果:

    ********
    Hibernate:
    select
    user0_.id as id0_0_,
    user0_.name as name0_0_
    from
    mydb.user user0_
    where
    user0_.id=?
    User [id=2, name=sara2]

    可以看出get方法直接发出sql语句,从数据库加载,没有延迟。load方法只有真正用到对象的内容时才会发出sql语句

    接下来再用两个测试用例

    get测试用例

    public class Test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
            SessionFactory sessionFactory=(SessionFactory) ac.getBean("sessionFactory");
            Session session=sessionFactory.openSession();
        
            User user1=(User) session.get(User.class, 3);
            System.out.println("-----------");
            System.out.println(user1.getClass());
    
            session.close();
    
        }
    
    }

    输出结果是:

    Hibernate:
    select
    user0_.id as id0_0_,
    user0_.name as name0_0_
    from
    mydb.user user0_
    where
    user0_.id=?
    -----------
    class com.db.entity.User

    load测试代码:

    public class Test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
            SessionFactory sessionFactory=(SessionFactory) ac.getBean("sessionFactory");
            Session session=sessionFactory.openSession();
        
            User user2=(User) session.load(User.class,2);
            System.out.println("********");
            System.out.println(user2.getClass());
            session.close();
        }
    }

    输出结果是:

    ********
    class com.db.entity.User_$$_javassist_0

    结论:

      get方法会在调用之后立即向数据库发出sql语句(不考虑缓存的情况下),返回持久化对象;而load方法会在调用后返回一个代理对象,该代理对象只保存了实体对象的id,直到使用对象的非主键属性时才会发出sql语句

  • 相关阅读:
    一个iOS图片选择器的DEMO(实现图片添加,宫格排列,图片长按删除,以及图片替换等功能)
    [小细节,大BUG]记录一些小问题引起的大BUG(长期更新....)
    利用runTime,实现以模型为主的字典转模型(注意与KVC的区别)
    项目总结(三)--- 关于版本控制器
    项目总结(一)--- 关于用到的设计模式
    EntityFramework与TransactionScope事务和并发控制
    Entity Framework与ADO.NET批量插入数据性能测试
    Mathtype公式位置偏上
    FreeSWITCH 加载模块过程解读
    FreeSWITCH调用第三方TTS 使用tts_commandline
  • 原文地址:https://www.cnblogs.com/SaraMoring/p/5655456.html
Copyright © 2011-2022 走看看