hibernate 集合上的lazy策略

来源:互联网 发布:深圳潮流网络 编辑:程序博客网 时间:2024/05/17 23:34
hibernate在集合上的lazy策略,可以取值:true/false/extra

<class>标签上的lazy不会影响到集合上的lazy特性

建议将集合上的lazy设置成extra

1.实体类
Java代码  收藏代码
  1. package com.yx.zzg.bo;  
  2.   
  3. import java.util.Set;  
  4.   
  5. public class Classes {  
  6.       
  7.     private int id;  
  8.       
  9.     private String name;  
  10.       
  11.     private Set students;   
  12.       
  13.     public int getId() {  
  14.         return id;  
  15.     }  
  16.   
  17.     public void setId(int id) {  
  18.         this.id = id;  
  19.     }  
  20.   
  21.     public String getName() {  
  22.         return name;  
  23.     }  
  24.   
  25.     public void setName(String name) {  
  26.         this.name = name;  
  27.     }  
  28.   
  29.     public Set getStudents() {  
  30.         return students;  
  31.     }  
  32.   
  33.     public void setStudents(Set students) {  
  34.         this.students = students;  
  35.     }  
  36.       
  37. }  


Java代码  收藏代码
  1. package com.yx.zzg.bo;  
  2.   
  3. public class Student {  
  4.       
  5.     private int id;  
  6.       
  7.     private String name;  
  8.       
  9.     private Classes classes;  
  10.   
  11.     public int getId() {  
  12.         return id;  
  13.     }  
  14.   
  15.     public void setId(int id) {  
  16.         this.id = id;  
  17.     }  
  18.   
  19.     public String getName() {  
  20.         return name;  
  21.     }  
  22.   
  23.     public void setName(String name) {  
  24.         this.name = name;  
  25.     }  
  26.   
  27.     public Classes getClasses() {  
  28.         return classes;  
  29.     }  
  30.   
  31.     public void setClasses(Classes classes) {  
  32.         this.classes = classes;  
  33.     }  
  34. }  


2.实体类映射文件
Java代码  收藏代码
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping>  
  6.     <class name="com.yx.zzg.bo.Student" table="t_student">  
  7.         <id name="id">  
  8.             <generator class="native"/>  
  9.         </id>  
  10.         <property name="name"/>  
  11.         <many-to-one name="classes" column="classesid"/>  
  12.     </class>  
  13. </hibernate-mapping>  


Java代码  收藏代码
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping package="com.yx.zzg.bo">  
  6.     <class name="Classes" table="t_classes">  
  7.         <id name="id">  
  8.             <generator class="native"/>  
  9.         </id>  
  10.         <property name="name"/>  
  11.         <set name="students" inverse="true" cascade="all">  
  12.             <key column="classesid"/>  
  13.             <one-to-many class="Student"/>  
  14.         </set>  
  15.     </class>  
  16. </hibernate-mapping>  


3.测试类1:CellectionlazyTest1.java
Java代码  收藏代码
  1. package com.yx.zzg.test;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Iterator;  
  5. import java.util.Set;  
  6. import com.yx.zzg.bo.*;  
  7.   
  8. import junit.framework.TestCase;  
  9.   
  10. import org.hibernate.Session;  
  11.   
  12. /** 
  13.  * 保持lazy默认 
  14.  * @author Administrator 
  15.  * 
  16.  */  
  17. public class CellectionlazyTest1 extends TestCase {  
  18.   
  19.   
  20.     public void testLoad1() {  
  21.         Session session = null;  
  22.         try {  
  23.             session = HibernateUtils.getSession();  
  24.             session.beginTransaction();  
  25.               
  26.             //不会发出sql  
  27.             Classes classes = (Classes)session.load(Classes.class1);  
  28.               
  29.             //会发出sql  
  30.             System.out.println("classes.name=" + classes.getName());  
  31.               
  32.             //不会发出sql  
  33.             Set students = classes.getStudents();  
  34.               
  35.             //会发出sql  
  36.             for (Iterator iter=students.iterator(); iter.hasNext();) {  
  37.                 Student student = (Student)iter.next();  
  38.                 System.out.println("student.name=" + student.getName());  
  39.             }  
  40.             session.getTransaction().commit();  
  41.         }catch(Exception e) {  
  42.             e.printStackTrace();  
  43.             session.getTransaction().rollback();  
  44.         }finally {  
  45.             HibernateUtils.closeSession(session);  
  46.         }  
  47.     }     
  48.       
  49.     public void testLoad2() {  
  50.         Session session = null;  
  51.         try {  
  52.             session = HibernateUtils.getSession();  
  53.             session.beginTransaction();  
  54.               
  55.             //不会发出sql  
  56.             Classes classes = (Classes)session.load(Classes.class1);  
  57.               
  58.             //会发出sql  
  59.             System.out.println("classes.name=" + classes.getName());  
  60.               
  61.             //不会发出sql  
  62.             Set students = classes.getStudents();  
  63.               
  64.             //会发出sql,发出查询全部数据的sql  
  65.             System.out.println("student.count=" + students.size());  
  66.             session.getTransaction().commit();  
  67.         }catch(Exception e) {  
  68.             e.printStackTrace();  
  69.             session.getTransaction().rollback();  
  70.         }finally {  
  71.             HibernateUtils.closeSession(session);  
  72.         }  
  73.     }         
  74. }  


测试类2:CellectionlazyTest2.java
Java代码  收藏代码
  1. package com.yx.zzg.test;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Iterator;  
  5. import java.util.Set;  
  6. import com.yx.zzg.bo.*;  
  7.   
  8. import junit.framework.TestCase;  
  9.   
  10. import org.hibernate.Session;  
  11.   
  12. /** 
  13.  * 设置<class>标签上的lazy=false 
  14.  * @author Administrator 
  15.  * 
  16.  */  
  17. public class CellectionlazyTest2 extends TestCase {  
  18.   
  19.   
  20.     public void testLoad1() {  
  21.         Session session = null;  
  22.         try {  
  23.             session = HibernateUtils.getSession();  
  24.             session.beginTransaction();  
  25.               
  26.             //会发出sql  
  27.             Classes classes = (Classes)session.load(Classes.class1);  
  28.               
  29.             //不会发出sql  
  30.             System.out.println("classes.name=" + classes.getName());  
  31.               
  32.             //不会发出sql  
  33.             Set students = classes.getStudents();  
  34.               
  35.             //会发出sql  
  36.             for (Iterator iter=students.iterator(); iter.hasNext();) {  
  37.                 Student student = (Student)iter.next();  
  38.                 System.out.println("student.name=" + student.getName());  
  39.             }  
  40.             session.getTransaction().commit();  
  41.         }catch(Exception e) {  
  42.             e.printStackTrace();  
  43.             session.getTransaction().rollback();  
  44.         }finally {  
  45.             HibernateUtils.closeSession(session);  
  46.         }  
  47.     }     
  48. }  


测试类3:CellectionlazyTest3.java
Java代码  收藏代码
  1. package com.yx.zzg.bo;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Iterator;  
  5. import java.util.Set;  
  6. import com.yx.zzg.bo.*  
  7.   
  8. import junit.framework.TestCase;  
  9.   
  10. import org.hibernate.Session;  
  11.   
  12. /** 
  13.  * 设置集合上的lazy=false,其它默认 
  14.  * @author Administrator 
  15.  * 
  16.  */  
  17. public class CellectionlazyTest3 extends TestCase {  
  18.   
  19.   
  20.     public void testLoad1() {  
  21.         Session session = null;  
  22.         try {  
  23.             session = HibernateUtils.getSession();  
  24.             session.beginTransaction();  
  25.               
  26.             //不会发出sql  
  27.             Classes classes = (Classes)session.load(Classes.class1);  
  28.               
  29.             //会发出sql,会发出两条sql分别加载Classes和Student  
  30.             System.out.println("classes.name=" + classes.getName());  
  31.               
  32.             //不会发出sql  
  33.             Set students = classes.getStudents();  
  34.               
  35.             //不会发出sql  
  36.             for (Iterator iter=students.iterator(); iter.hasNext();) {  
  37.                 Student student = (Student)iter.next();  
  38.                 System.out.println("student.name=" + student.getName());  
  39.             }  
  40.             session.getTransaction().commit();  
  41.         }catch(Exception e) {  
  42.             e.printStackTrace();  
  43.             session.getTransaction().rollback();  
  44.         }finally {  
  45.             HibernateUtils.closeSession(session);  
  46.         }  
  47.     }     
  48.       
  49.     public void testLoad2() {  
  50.         Session session = null;  
  51.         try {  
  52.             session = HibernateUtils.getSession();  
  53.             session.beginTransaction();  
  54.               
  55.             //不会发出sql  
  56.             Classes classes = (Classes)session.load(Classes.class1);  
  57.               
  58.             //会发出sql,会发出两条sql分别加载Classes和Student  
  59.             System.out.println("classes.name=" + classes.getName());  
  60.               
  61.             //不会发出sql  
  62.             Set students = classes.getStudents();  
  63.               
  64.             //不会发出sql  
  65.             System.out.println("student.count=" + students.size());  
  66.             session.getTransaction().commit();  
  67.         }catch(Exception e) {  
  68.             e.printStackTrace();  
  69.             session.getTransaction().rollback();  
  70.         }finally {  
  71.             HibernateUtils.closeSession(session);  
  72.         }  
  73.     }         
  74. }  


测试类4:CellectionlazyTest4.java
Java代码  收藏代码
  1. package com.yx.zzg.test;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Iterator;  
  5. import java.util.Set;  
  6. import com.yx.zzg.bo.*;  
  7.   
  8. import junit.framework.TestCase;  
  9.   
  10. import org.hibernate.Session;  
  11.   
  12. /** 
  13.  * 设置集合上的lazy=extra,其它默认 
  14.  * @author Administrator 
  15.  * 
  16.  */  
  17. public class CellectionlazyTest4 extends TestCase {  
  18.   
  19.     public void testLoad1() {  
  20.         Session session = null;  
  21.         try {  
  22.             session = HibernateUtils.getSession();  
  23.             session.beginTransaction();  
  24.               
  25.             //不会发出sql  
  26.             Classes classes = (Classes)session.load(Classes.class1);  
  27.               
  28.             //会发出sql  
  29.             System.out.println("classes.name=" + classes.getName());  
  30.               
  31.             //不会发出sql  
  32.             Set students = classes.getStudents();  
  33.               
  34.             //会发出sql  
  35.             for (Iterator iter=students.iterator(); iter.hasNext();) {  
  36.                 Student student = (Student)iter.next();  
  37.                 System.out.println("student.name=" + student.getName());  
  38.             }  
  39.             session.getTransaction().commit();  
  40.         }catch(Exception e) {  
  41.             e.printStackTrace();  
  42.             session.getTransaction().rollback();  
  43.         }finally {  
  44.             HibernateUtils.closeSession(session);  
  45.         }  
  46.     }     
  47.       
  48.     public void testLoad2() {  
  49.         Session session = null;  
  50.         try {  
  51.             session = HibernateUtils.getSession();  
  52.             session.beginTransaction();  
  53.               
  54.             //不会发出sql  
  55.             Classes classes = (Classes)session.load(Classes.class1);  
  56.               
  57.             //会发出sql  
  58.             System.out.println("classes.name=" + classes.getName());  
  59.               
  60.             //不会发出sql  
  61.             Set students = classes.getStudents();  
  62.             //会发出sql,发出一条比较智能的sql  
  63.             System.out.println("student.count=" + students.size());  
  64.             session.getTransaction().commit();  
  65.         }catch(Exception e) {  
  66.             e.printStackTrace();  
  67.             session.getTransaction().rollback();  
  68.         }finally {  
  69.             HibernateUtils.closeSession(session);  
  70.         }  
  71.     }         

原文 :http://skyuck.iteye.com/blog/484561    未验证 。。


原创粉丝点击