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的作用域内有效



  • 相关阅读:
    Swift入坑系列—集合类型
    Java正则表达式入门
    Swift基础--手势识别(双击、捏、旋转、拖动、划动、长按)
    Swift之手势总结
    Matlab图像彩色转灰色
    HDU1754_I Hate It(线段树/单点更新)
    Cocos2d-x-lua游戏两个场景互相切换MainScene01切换到MainScene02
    freemarker自己定义标签(二)
    hibernate 在tomcat7.X 下配置mysql数据源
    WinCE隐藏显示任务栏,当任务栏隐藏时将其显示,当任务栏显示时将其隐藏(FindWindow,ShowWindow,IsWindowVisible),
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6986230.html
Copyright © 2011-2022 走看看