* <class>標籤上:可以取值true/false
* <property>標籤上,可以取值true/false,這個特性需要類增強
* <set>/<list>等集合上,可以取值爲true/false/extra
* <one-to-one>/<many-to-one>等標籤上,可以取值false/proxy/no-proxy
重要的概念:
1、lazy的概念,指在需要的時候才發出sql
2、lazy策略只是在session打開期間纔是有效的
注意:
Hibernate類級別的lazy加載策略:可以控制什麼時候加載這些普通對象屬性
測試單元的使用:
請先運行初時化程序InitData,在執行每個單元測試
Hibernate集合屬性的懶加載策略:
在集合屬性上,可以配置懶加載策略,取值爲:true/false/extra
true:默認取值,它的意思是只有在調用這個集合獲取裏面的元素對象時,才發出查詢語句,加載其
集合元素的數據
false:取消懶加載特性,即在加載對象的同時,就發出第二條查詢語句加載其關聯集合的數據
extra:一種比較聰明的懶加載策略,即調用集合的size/contains等方法的時候,hibernate並不會去加載整個集合的數據,而是發出一條聰明的SQL語句,以便獲得需要的值,只有在真正需要用到這些集合元素對象數據的時候,纔去發出查詢語句加載所有對象的數據
Hibernate單端關聯懶加載策略:即在<one-to-one>/<many-to-one>標籤上可以配置
懶加載策略。
可以取值爲:false/proxy/no-proxy
false:取消懶加載策略,即在加載對象的同時,發出查詢語句,加載其關聯對象
proxy:這是hibernate對單端關聯的默認懶加載策略,即只有在調用到其關聯對象的方法的時候
才真正發出查詢語句查詢其對象數據,其關聯對象是代理類
no-proxy:這種懶加載特性需要對類進行增強,使用no-proxy,其關聯對象不是代理類
注意:在class標籤上配置的lazy屬性不會影響到關聯對象!!!
- <hibernate-mapping>
- <class name="com.bjsxt.hibernate.Group" table="t_group">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- </class>
- </hibernate-mapping>
<hibernate-mapping>
<class name="com.bjsxt.hibernate.Group" table="t_group">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
- package com.bjsxt.hibernate;
- import org.hibernate.Session;
- import com.bjsxt.hibernate.Group;
- import com.bjsxt.hibernate.HibernateUtils;
- public class InitData {
- public static void main(String[] args) {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- Group group = new Group();
- group.setName("java開發組");
- session.save(group);
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- }
package com.bjsxt.hibernate;
import org.hibernate.Session;
import com.bjsxt.hibernate.Group;
import com.bjsxt.hibernate.HibernateUtils;
public class InitData {
public static void main(String[] args) {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
Group group = new Group();
group.setName("java開發組");
session.save(group);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}
- package com.bjsxt.hibernate;
- import org.hibernate.Session;
- import junit.framework.TestCase;
- /**
- * 運行本單元測試的前提條件:
- * 設置<class>標籤中的lazy="true",或是保持默認(即不配置lazy屬性)
- *
- * @author Administrator
- *
- */
- public class ClassLazyTest extends TestCase {
- public void testLoadGroup1() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- //不會發出查詢sql
- Group group = (Group)session.load(Group.class, 1);
- //不會發出查詢sql
- System.out.println("group id=" + group.getId());
- //發出查詢sql,加載數據到Group
- System.out.println("group name=" + group.getName());
- //不會發出查詢sql
- System.out.println("group name=" + group.getName());
- }catch(Exception e) {
- e.printStackTrace();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- public void testLoadGroup2() {
- Session session = null;
- Group group = null;
- try {
- session = HibernateUtils.getSession();
- //不會發出查詢sql
- group = (Group)session.load(Group.class, 1);
- }catch(Exception e) {
- e.printStackTrace();
- }finally {
- HibernateUtils.closeSession(session);
- }
- //不能正常輸出,拋出了 LazyInitializationException,因爲session已經關閉了
- //注意:Hibernate支持Lazy策略,只有session打開狀態纔有效
- System.out.println("group name=" + group.getName());
- }
- }
package com.bjsxt.hibernate;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 運行本單元測試的前提條件:
* 設置<class>標籤中的lazy="true",或是保持默認(即不配置lazy屬性)
*
* @author Administrator
*
*/
public class ClassLazyTest extends TestCase {
public void testLoadGroup1() {
Session session = null;
try {
session = HibernateUtils.getSession();
//不會發出查詢sql
Group group = (Group)session.load(Group.class, 1);
//不會發出查詢sql
System.out.println("group id=" + group.getId());
//發出查詢sql,加載數據到Group
System.out.println("group name=" + group.getName());
//不會發出查詢sql
System.out.println("group name=" + group.getName());
}catch(Exception e) {
e.printStackTrace();
}finally {
HibernateUtils.closeSession(session);
}
}
public void testLoadGroup2() {
Session session = null;
Group group = null;
try {
session = HibernateUtils.getSession();
//不會發出查詢sql
group = (Group)session.load(Group.class, 1);
}catch(Exception e) {
e.printStackTrace();
}finally {
HibernateUtils.closeSession(session);
}
//不能正常輸出,拋出了 LazyInitializationException,因爲session已經關閉了
//注意:Hibernate支持Lazy策略,只有session打開狀態纔有效
System.out.println("group name=" + group.getName());
}
}
---------------------------------------------------------------------
集合類測試
- <hibernate-mapping>
- <class name="com.bjsxt.hibernate.Classes" table="t_classes">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <!--
- <set name="students" cascade="all" order-by="id">
- -->
- <set name="students" lazy="extra">
- <key column="classid"/>
- <one-to-many class="com.bjsxt.hibernate.Student"/>
- </set>
- </class>
- </hibernate-mapping>
- <hibernate-mapping>
- <class name="com.bjsxt.hibernate.Student" table="t_student">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- </class>
- </hibernate-mapping>
<hibernate-mapping>
<class name="com.bjsxt.hibernate.Classes" table="t_classes">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!--
<set name="students" cascade="all" order-by="id">
-->
<set name="students" lazy="extra">
<key column="classid"/>
<one-to-many class="com.bjsxt.hibernate.Student"/>
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.bjsxt.hibernate.Student" table="t_student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
- package com.bjsxt.hibernate;
- import java.util.Iterator;
- import java.util.Set;
- import org.hibernate.Session;
- import junit.framework.TestCase;
- /**
- * 保持lazy的默認值
- * @author Administrator
- *
- */
- public class CollectionLazyTest1 extends TestCase {
- public void testLoadClasses1() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- //不會發出查詢sql
- Classes classes = (Classes)session.load(Classes.class, 1);
- //會發出一條查詢sql,加載數據到classes
- System.out.println("班級:【" + classes.getName() + "】 擁有的學生:");
- //不會發出查詢sql
- Set students = classes.getStudents();
- //會發出一條查詢sql,加載數據到Students
- for (Iterator iter = students.iterator(); iter.hasNext();) {
- Student student = (Student)iter.next();
- System.out.println(student.getName());
- }
- }catch(Exception e) {
- e.printStackTrace();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- public void testLoadClasses2() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- //不會發出查詢sql
- Classes classes = (Classes)session.load(Classes.class, 1);
- //會發出一條查詢sql,加載數據到classes
- System.out.println("班級:【" + classes.getName() + "】 擁有的學生總數:");
- //不會發出查詢sql
- Set students = classes.getStudents();
- //會發出一條查詢sql,加載全部的數據到Students
- System.out.println(students.size());
- }catch(Exception e) {
- e.printStackTrace();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- }
package com.bjsxt.hibernate;
import java.util.Iterator;
import java.util.Set;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 保持lazy的默認值
* @author Administrator
*
*/
public class CollectionLazyTest1 extends TestCase {
public void testLoadClasses1() {
Session session = null;
try {
session = HibernateUtils.getSession();
//不會發出查詢sql
Classes classes = (Classes)session.load(Classes.class, 1);
//會發出一條查詢sql,加載數據到classes
System.out.println("班級:【" + classes.getName() + "】 擁有的學生:");
//不會發出查詢sql
Set students = classes.getStudents();
//會發出一條查詢sql,加載數據到Students
for (Iterator iter = students.iterator(); iter.hasNext();) {
Student student = (Student)iter.next();
System.out.println(student.getName());
}
}catch(Exception e) {
e.printStackTrace();
}finally {
HibernateUtils.closeSession(session);
}
}
public void testLoadClasses2() {
Session session = null;
try {
session = HibernateUtils.getSession();
//不會發出查詢sql
Classes classes = (Classes)session.load(Classes.class, 1);
//會發出一條查詢sql,加載數據到classes
System.out.println("班級:【" + classes.getName() + "】 擁有的學生總數:");
//不會發出查詢sql
Set students = classes.getStudents();
//會發出一條查詢sql,加載全部的數據到Students
System.out.println(students.size());
}catch(Exception e) {
e.printStackTrace();
}finally {
HibernateUtils.closeSession(session);
}
}
}
- package com.bjsxt.hibernate;
- import java.util.Iterator;
- import java.util.Set;
- import org.hibernate.Session;
- import junit.framework.TestCase;
- /**
- * 設置集合上的lazy=false
- * @author Administrator
- *
- */
- public class CollectionLazyTest2 extends TestCase {
- public void testLoadClasses1() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- //不會發出查詢sql
- Classes classes = (Classes)session.load(Classes.class, 1);
- //會發出兩條查詢sql,加載數據到classes和Students中
- System.out.println("班級:【" + classes.getName() + "】 擁有的學生:");
- //不會發出查詢sql
- Set students = classes.getStudents();
- //不會發出查詢sql
- for (Iterator iter = students.iterator(); iter.hasNext();) {
- Student student = (Student)iter.next();
- System.out.println(student.getName());
- }
- }catch(Exception e) {
- e.printStackTrace();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- public void testLoadClasses2() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- //不會發出查詢sql
- Classes classes = (Classes)session.load(Classes.class, 1);
- //會發出兩條查詢sql,加載數據到classes和Students中
- System.out.println("班級:【" + classes.getName() + "】 擁有的學生總數:");
- //不會發出查詢sql
- Set students = classes.getStudents();
- //不會發出查詢sql
- System.out.println(students.size());
- }catch(Exception e) {
- e.printStackTrace();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- }
package com.bjsxt.hibernate;
import java.util.Iterator;
import java.util.Set;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 設置集合上的lazy=false
* @author Administrator
*
*/
public class CollectionLazyTest2 extends TestCase {
public void testLoadClasses1() {
Session session = null;
try {
session = HibernateUtils.getSession();
//不會發出查詢sql
Classes classes = (Classes)session.load(Classes.class, 1);
//會發出兩條查詢sql,加載數據到classes和Students中
System.out.println("班級:【" + classes.getName() + "】 擁有的學生:");
//不會發出查詢sql
Set students = classes.getStudents();
//不會發出查詢sql
for (Iterator iter = students.iterator(); iter.hasNext();) {
Student student = (Student)iter.next();
System.out.println(student.getName());
}
}catch(Exception e) {
e.printStackTrace();
}finally {
HibernateUtils.closeSession(session);
}
}
public void testLoadClasses2() {
Session session = null;
try {
session = HibernateUtils.getSession();
//不會發出查詢sql
Classes classes = (Classes)session.load(Classes.class, 1);
//會發出兩條查詢sql,加載數據到classes和Students中
System.out.println("班級:【" + classes.getName() + "】 擁有的學生總數:");
//不會發出查詢sql
Set students = classes.getStudents();
//不會發出查詢sql
System.out.println(students.size());
}catch(Exception e) {
e.printStackTrace();
}finally {
HibernateUtils.closeSession(session);
}
}
}
- package com.bjsxt.hibernate;
- import java.util.Iterator;
- import java.util.Set;
- import org.hibernate.Session;
- import junit.framework.TestCase;
- /**
- * 設置集合上的lazy=extra
- * @author Administrator
- *
- */
- public class CollectionLazyTest3 extends TestCase {
- public void testLoadClasses1() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- //不會發出查詢sql
- Classes classes = (Classes)session.load(Classes.class, 1);
- //會發出一條查詢sql,加載數據到classes
- System.out.println("班級:【" + classes.getName() + "】 擁有的學生:");
- //不會發出查詢sql
- Set students = classes.getStudents();
- //會發出一條查詢sql,加載數據到students
- for (Iterator iter = students.iterator(); iter.hasNext();) {
- Student student = (Student)iter.next();
- System.out.println(student.getName());
- }
- }catch(Exception e) {
- e.printStackTrace();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- public void testLoadClasses2() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- //不會發出查詢sql
- Classes classes = (Classes)session.load(Classes.class, 1);
- //會發出一條查詢sql,加載數據到classes
- System.out.println("班級:【" + classes.getName() + "】 擁有的學生總數:");
- //不會發出查詢sql
- Set students = classes.getStudents();
- //會發出一條較爲智能的查詢sql,如:
- //select count(id) from t_student where classid =?
- System.out.println(students.size());
- }catch(Exception e) {
- e.printStackTrace();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- }
package com.bjsxt.hibernate;
import java.util.Iterator;
import java.util.Set;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 設置集合上的lazy=extra
* @author Administrator
*
*/
public class CollectionLazyTest3 extends TestCase {
public void testLoadClasses1() {
Session session = null;
try {
session = HibernateUtils.getSession();
//不會發出查詢sql
Classes classes = (Classes)session.load(Classes.class, 1);
//會發出一條查詢sql,加載數據到classes
System.out.println("班級:【" + classes.getName() + "】 擁有的學生:");
//不會發出查詢sql
Set students = classes.getStudents();
//會發出一條查詢sql,加載數據到students
for (Iterator iter = students.iterator(); iter.hasNext();) {
Student student = (Student)iter.next();
System.out.println(student.getName());
}
}catch(Exception e) {
e.printStackTrace();
}finally {
HibernateUtils.closeSession(session);
}
}
public void testLoadClasses2() {
Session session = null;
try {
session = HibernateUtils.getSession();
//不會發出查詢sql
Classes classes = (Classes)session.load(Classes.class, 1);
//會發出一條查詢sql,加載數據到classes
System.out.println("班級:【" + classes.getName() + "】 擁有的學生總數:");
//不會發出查詢sql
Set students = classes.getStudents();
//會發出一條較爲智能的查詢sql,如:
//select count(id) from t_student where classid =?
System.out.println(students.size());
}catch(Exception e) {
e.printStackTrace();
}finally {
HibernateUtils.closeSession(session);
}
}
}
----------------------------------------------------------------
單端關聯加載
- <hibernate-mapping>
- <class name="com.bjsxt.hibernate.Group" table="t_group">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- </class>
- </hibernate-mapping>
- <hibernate-mapping>
- <class name="com.bjsxt.hibernate.User" table="t_user" >
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <!--
- <many-to-one name="group" column="relatedGroup" />
- -->
- <many-to-one name="group" column="relatedGroup"/>
- </class>
- </hibernate-mapping>
<hibernate-mapping>
<class name="com.bjsxt.hibernate.Group" table="t_group">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.bjsxt.hibernate.User" table="t_user" >
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!--
<many-to-one name="group" column="relatedGroup" />
-->
<many-to-one name="group" column="relatedGroup"/>
</class>
</hibernate-mapping>
- package com.bjsxt.hibernate;
- import org.hibernate.Session;
- import junit.framework.TestCase;
- /**
- * 所有lazy的屬性默認
- * @author Administrator
- *
- */
- public class SingleEndTest1 extends TestCase {
- public void testLoadUser() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- //不會發出查詢sql
- User user = (User)session.load(User.class, 2);
- //會發出一條查詢sql,轉載數據到User
- System.out.println("user name=" + user.getName());
- //不會發出查詢sql
- Group group = user.getGroup();
- //會發出一條查詢sql,轉載數據到Group
- System.out.println("related group=" + group.getName());
- }catch(Exception e) {
- e.printStackTrace();
- }finally {
- }
- }
- }
package com.bjsxt.hibernate;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 所有lazy的屬性默認
* @author Administrator
*
*/
public class SingleEndTest1 extends TestCase {
public void testLoadUser() {
Session session = null;
try {
session = HibernateUtils.getSession();
//不會發出查詢sql
User user = (User)session.load(User.class, 2);
//會發出一條查詢sql,轉載數據到User
System.out.println("user name=" + user.getName());
//不會發出查詢sql
Group group = user.getGroup();
//會發出一條查詢sql,轉載數據到Group
System.out.println("related group=" + group.getName());
}catch(Exception e) {
e.printStackTrace();
}finally {
}
}
}
- package com.bjsxt.hibernate;
- import org.hibernate.Session;
- import junit.framework.TestCase;
- /**
- * 將<class>標籤中的lazy設置爲false
- * @author Administrator
- *
- */
- public class SingleEndTest2 extends TestCase {
- public void testLoadUser() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- //會發出一條查詢sql,轉載數據到User
- User user = (User)session.load(User.class, 2);
- //不會發出查詢sql
- System.out.println("user name=" + user.getName());
- //不會發出查詢sql
- Group group = user.getGroup();
- //會發出一條查詢sql,轉載數據到Group
- System.out.println("related group=" + group.getName());
- }catch(Exception e) {
- e.printStackTrace();
- }finally {
- }
- }
- }
package com.bjsxt.hibernate;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 將<class>標籤中的lazy設置爲false
* @author Administrator
*
*/
public class SingleEndTest2 extends TestCase {
public void testLoadUser() {
Session session = null;
try {
session = HibernateUtils.getSession();
//會發出一條查詢sql,轉載數據到User
User user = (User)session.load(User.class, 2);
//不會發出查詢sql
System.out.println("user name=" + user.getName());
//不會發出查詢sql
Group group = user.getGroup();
//會發出一條查詢sql,轉載數據到Group
System.out.println("related group=" + group.getName());
}catch(Exception e) {
e.printStackTrace();
}finally {
}
}
}
- package com.bjsxt.hibernate;
- import org.hibernate.Session;
- import junit.framework.TestCase;
- /**
- * 保持<class>標籤中的lazy默認設置
- * 將<many-to-one>標籤中加入lazy=false
- * @author Administrator
- *
- */
- public class SingleEndTest3 extends TestCase {
- public void testLoadUser() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- //會發出一條查詢sql,轉載數據到User
- User user = (User)session.load(User.class, 2);
- //不會發出查詢sql
- System.out.println("user name=" + user.getName());
- //不會發出查詢sql
- Group group = user.getGroup();
- //會發出一條查詢sql,轉載數據到Group
- System.out.println("related group=" + group.getName());
- }catch(Exception e) {
- e.printStackTrace();
- }finally {
- }
- }
- }