zoukankan      html  css  js  c++  java
  • hibernate之4.延迟载入

    延迟载入:

    仅仅有当使用以实体对象的属性(除主键属性外)时,才会发送查询语句到数据库


    get不支持延迟载入

    @Test
    	public void getTest(){
    		Session session=null;
    		Student student=null;
    		try{
    			session=HibernateUtil.openSession();
    			student=(Student) session.get(Student.class, 3);
    			System.out.println("id:"+student.getStudentId());
    			System.out.println("name:"+student.getStudentName());
    		}finally{
    			session.close();
    		}
    	}

    结果:

    Hibernate: select student0_.student_id as student1_0_0_, student0_.student_name as student2_0_0_, student0_.age as age0_0_ from t_student student0_ where student0_.student_id=?
    id:3
    name:ddddd

    在调用get方法时,就已经发出查询语句

    load支持延迟载入

    @Test
    	public void loadTest(){
    		Session session=null;
    		Student student=null;
    		try{
    			session=HibernateUtil.openSession();
    			student=(Student) session.load(Student.class, 3);
    			System.out.println("id:"+student.getStudentId());
    			System.out.println("name:"+student.getStudentName());
    		}finally{
    			session.close();
    		}
    		
    	}

    结果:

    id:3
    Hibernate: select student0_.student_id as student1_0_0_, student0_.student_name as student2_0_0_, student0_.age as age0_0_ from t_student student0_ where student0_.student_id=?
    name:ddddd

    在调用load方法,返回一个代理对象,此时并没有发出查询语句,当须要使用studentName属性时,再发出查询语句


    关闭session后

    get:

    @Test
    	public void get2Test(){
    		Session session=null;
    		Student student=null;
    		try{
    			session=HibernateUtil.openSession();
    			student=(Student) session.get(Student.class, 3);
    		}finally{
    			session.close();
    		}
    		System.out.println("id:"+student.getStudentId());
    		System.out.println("name:"+student.getStudentName());
    	}

    结果:

    Hibernate: select student0_.student_id as student1_0_0_, student0_.student_name as student2_0_0_, student0_.age as age0_0_ from t_student student0_ where student0_.student_id=?

    id:3 name:ddddd


    与在session作用域中的结果一样


    load

    @Test
    	public void load2Test(){
    		Session session=null;
    		Student student=null;
    		try{
    			session=HibernateUtil.openSession();
    			student=(Student) session.load(Student.class, 3);
    		}finally{
    			session.close();
    		}
    		System.out.println("id:"+student.getStudentId());
    		System.out.println("name:"+student.getStudentName());
    	}

    结果:

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

    抛异常了,可见延时载入仅仅在session的作用域内有效

    小结:

    1.仅仅有当使用以实体对象的属性(除主键属性外)时,才会发送查询语句到数据库

    2.延时载入仅仅在session的作用域内有效



  • 相关阅读:
    iOS开发之ImageView复用实现图片无限轮播
    IOS 通过脚本自动打包工具 webfrogs/xcode_shell
    (iOS)判断GPS坐标是否在中国
    如何轻松实现iOS9多任务管理器效果(iCarousel高级教程)
    有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?
    PID控制算法的C语言实现四 增量型PID的C语言实现
    PID控制算法的C语言实现三 位置型PID的C语言实现
    PID控制算法的C语言实现二 PID算法的离散化
    PID控制算法的C语言实现一 PID算法原理
    人生是一个连续的过程,没什么东西能影响人的一生,怎么选择不是问题。问题是每天都要努力 (转)
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6986230.html
Copyright © 2011-2022 走看看