`

hibernate基础-lazy策略

阅读更多

lazy策略可以使用在:
   * <class>标签上,可以取值:true/false
   * <property>标签上,可以取值:true/false需要类增强工具
   * <set><list>标签上,可以取值:true/false/extra
   * <one-to-one><many-to-one>单端关联上,可以取值:false/proxy/noproxy
lazy概念:只有真正使用该对象时,才会创建,对于hibernate而言,正真使用时才会发出sql

注意:hibernate支持lazy策略只有在session打开关态下有效
      <class>标签上的lazy特性只对普通属性起作用,不会影响到集合上的lazy特性
      <class>标签上的lazy特性只对普通属性起作用,不会影响到单端关联上的lazy特性
在jsp中使用OpenSessionInview模式,一般采用filter实现


lazy策略在<class>上
//设置<class>标签上的lazy="true",也就是默认配置
    public void testload1(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
//不会发sql
            Group g=(Group)session.load(Group.class1);
            
//不会发sql
            System.out.println(g.getId());
            
//会发sql
            System.out.println(g.getName());
        
            session.getTransaction().commit();
        }
catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

    
    
public void testload2(){
        Session session
=null;
        Group g
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
//不会发sql
            g=(Group)session.load(Group.class1);
            
//不会发sql
            session.getTransaction().commit();
        }
catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }
finally{
            HibernateUtils.closeSession(session);
        }

        
//不能正确输出,抛出lazy初始化lazyInitializationException异常,因为session已经关闭
        
//hibernate支持lazy策略只有在session打开关态下有效
        System.out.println(g.getName());
    }

lazy策略在<set><list>上
<class>标签上的lazy特性只对普通属性起作用,不会影响到集合上的lazy特性
//保持lazy是默认配置
public void testLoad1(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
//不会发出sql
            Classes classes=(Classes)session.load(Classes.class3);
            
//会发出sql
            System.out.println(classes.getName());
            
//不会发出sql
            Set students=classes.getStudents();
            
//会发出sql,发出查询全部数据的sql
            System.out.println(students.size());
            session.getTransaction().commit();
        }
catch(Exception e){
            session.getTransaction().rollback();
            e.printStackTrace();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

    
    
//设置<class>标签上的lazy="false"
  public void testLoad1(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
//会发出sql
            Classes classes=(Classes)session.load(Classes.class3);
            
//不会发出sql
            System.out.println(classes.getName());
            
//不会发出sql,不会影响集合
            Set students=classes.getStudents();
            
//会发出sql,发出查询全部数据的sql
            System.out.println(students.size());
            session.getTransaction().commit();
        }
catch(Exception e){
            session.getTransaction().rollback();
            e.printStackTrace();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

    
    
//设置集合上的lazy="false",其他全为默认
  public void testLoad1(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
//不会发出sql
            Classes classes=(Classes)session.load(Classes.class3);
            
//会发出sql,会发出两条sql分别加载classes和Student
            System.out.println(classes.getName());
            
//不会发出sql
            Set students=classes.getStudents();
            
//不会发出sql
            System.out.println(students.size());
            session.getTransaction().commit();
        }
catch(Exception e){
            session.getTransaction().rollback();
            e.printStackTrace();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

    
        
//设置集合上的lazy="extra",其他全为默认(比智能,基本与lazy="true"相同)
    public void testLoad1(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
//不会发出sql
            Classes classes=(Classes)session.load(Classes.class3);
            
//会发出sql
            System.out.println(classes.getName());
            
//不会发出sql
            Set students=classes.getStudents();
            
//会发出sql,发出一条比较智能的sql
            System.out.println(students.size());
            session.getTransaction().commit();
        }
catch(Exception e){
            session.getTransaction().rollback();
            e.printStackTrace();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

lazy策略在<one-to-one><many-to-one>单端关联上
可以取值:false/proxy/noproxy,默认为proxy,noproxy为不用代理,使用自解码,要使用增强工具
//所有lazy全为默认
public void testload1(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
//不会发出sql
            User user=(User)session.load(User.class3);
            
//会发出sql
            System.out.println(user.getName());
            
//不会发出sql
            Group group=user.getGroup();
            
//会发出sql
            System.out.println(group.getName());
            session.getTransaction().commit();
        }
catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

    
    
//设置<many-to-one>的lazy="false",其他全为默认,效果同集合
public void testload1(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
//不会发出sql
            User user=(User)session.load(User.class3);
            
//会发出sql,会发出两条sql分别加载Group和User
            System.out.println(user.getName());
            
//不会发出sql
            Group group=user.getGroup();
            
//不会发出sql
            System.out.println(group.getName());
            session.getTransaction().commit();
        }
catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

    
    
//设置<class>标签上的lazy="false",其他全默认,效果同集合
    <class>标签上的lazy特性只对普通属性起作用,不会影响到<many-to-one>的lazy特性
    
public void testload1(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
//会发出sql
            User user=(User)session.load(User.class3);
            
//不会发出sql
            System.out.println(user.getName());
            
//不会发出sql,不会影响到<many-to-one>
            Group group=user.getGroup();
            
//会发出sql
            System.out.println(group.getName());
            session.getTransaction().commit();
        }
catch(Exception e)Codeh
分享到:
评论

相关推荐

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     5.1.2 Hibernate访问持久化类属性的策略  5.1.3 在持久化类的访问方法中加入程序逻辑  5.1.4 设置派生属性  5.1.5 控制insert和update语句  5.2 处理SQL引用标识符  5.3 创建命名策略  5.4 设置数据库Schema...

    hibernate3.2中文文档(chm格式)

    19.1.7. 使用延迟属性抓取(Using lazy property fetching) 19.2. 二级缓存(The Second Level Cache) 19.2.1. 缓存映射(Cache mappings) 19.2.2. 策略:只读缓存(Strategy: read only) 19.2.3. 策略:读/...

    HibernateAPI中文版.chm

    19.1.7. 使用延迟属性抓取(Using lazy property fetching) 19.2. 二级缓存(The Second Level Cache) 19.2.1. 缓存映射(Cache mappings) 19.2.2. 策略:只读缓存(Strategy: read only) 19.2.3. 策略:读/...

    Hibernate+中文文档

    5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    19.1.7. 使用延迟属性抓取(Using lazy property fetching) 19.2. 二级缓存(The Second Level Cache) 19.2.1. 缓存映射(Cache mappings) 19.2.2. 策略:只读缓存(Strategy: read only) 19.2.3. 策略:读/...

    Hibernate 中文 html 帮助文档

    5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.1.1. EntityResolver 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.4.1. Generator 5.1.4.2. 高...

    Hibernate中文详细学习文档

    5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器...

    hibernate 教程

    延迟初始化(延迟加载)(Lazy Initialization) 6.6. 集合排序(Sorted Collections) 6.7. 使用&lt;idbag&gt;&lt;br&gt;6.8. 双向关联(Bidirectional Associations) 6.9. 三重关联(Ternary Associations) 6.10....

    最全Hibernate 参考文档

    5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.4.1. Generator 5.1.4.2. 高/低位算法(Hi/Lo ...

    hibernate 体系结构与配置 参考文档(html)

    5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.4.1. Generator 5.1.4.2. 高/低位算法(Hi/Lo ...

    Hibernate教程

    6. 对象/关系数据库映射基础(Basic O/R Mapping) 6.1. 映射定义(Mapping declaration) 6.1.1. Doctype 6.1.2. hibernate-mapping 6.1.3. class 6.1.4. id 6.1.4.1. Generator 6.1.4.2. 高/低位算法(Hi/Lo ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     5.1.2 Hibernate访问持久化类属性的策略  5.1.3 在持久化类的访问方法中加入程序逻辑  5.1.4 设置派生属性  5.1.5 控制insert和update语句  5.2 处理SQL引用标识符  5.3 创建命名策略  5.4 设置数据库Schema...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     5.1.2 Hibernate访问持久化类属性的策略  5.1.3 在持久化类的访问方法中加入程序逻辑  5.1.4 设置派生属性  5.1.5 控制insert和update语句  5.2 处理SQL引用标识符  5.3 创建命名策略  5.4 设置数据库Schema...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     5.1.2 Hibernate访问持久化类属性的策略  5.1.3 在持久化类的访问方法中加入程序逻辑  5.1.4 设置派生属性  5.1.5 控制insert和update语句  5.2 处理SQL引用标识符  5.3 创建命名策略  5.4 设置数据库Schema...

    hibernate

    延迟初始化(延迟加载)(Lazy Initialization) 6.6. 集合排序(Sorted Collections) 6.7. 使用&lt;idbag&gt;&lt;br&gt;6.8. 双向关联(Bidirectional Associations) 6.9. 三重关联(Ternary Associations) 6.10....

    hibernate3.04中文文档.chm

    6. 对象/关系数据库映射基础(Basic O/R Mapping) 6.1. 映射定义(Mapping declaration) 6.1.1. Doctype 6.1.2. hibernate-mapping 6.1.3. class 6.1.4. id 6.1.4.1. Generator 6.1.4.2. 高/低位算法(Hi/Lo ...

    Hibernate3+中文参考文档

    5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.4.1. Generator 5.1.4.2. 高/低位算法(Hi/Lo ...

    hibernate 框架的基础四

    HQL的多表检索 事务及隔离级别 HQL优化 抓取策略

    Hibernate参考文档

    5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.1.1. EntityResolver 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.4.1. Generator 5.1.4.2. 高...

Global site tag (gtag.js) - Google Analytics