extra策略:
与lazy="true"类似。主要区别是增强延迟检策略能进一步延迟Customer对象的orders集合代理
实例的初始化时机:
当程序第一次访问orders属性的iterator()方法时,会导致orders集合代理类实例的初始化
当程序第一次访问order属性size(),contains()和isEmpty()方法时,Hibernate不会初始化orders集合类的实例,
仅通过特定的select语句查询必要的信息,不会检索所有的Order
懒加载:
也叫延迟加载,不是在执行获取操作时马上生成SQL,而是在第一次使用时生成SQL.
分成两种:
类组级别:
<class ... lazy="true/false">
属性级别:
<set/list/map/bag ... lazy="...">
<man-to-ont ... lazy="...">
<one-to-ont ... lazy="...">
在使用懒加载特性时,可能会有LazyInitializationException异常:
原因:
真正的支获取数据时,Session已经没有了。
解决办法:
方式一:让Session在真正加载后再关闭
方式二:或是在Session关闭前执行Hibernate.initialize(department.getEmployee());// 立即加载指定的懒加载对象
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 导入包 -->
<hibernate-mapping package="cn.itcast.f_hbm_oneToMany">
<!-- 类名 -->
<class name="Department" table="department">
<id name="id" type="integer" column="id_">
<generator class="native" />
</id>
<property name="name" type="string" column="name_" />
<!-- employee属性,Set集合,表达的是本类与Employee的一对多关系
class属性:关联的实体类型
key子元素:对方表中的外键列(多方的那个表)
inverse属性:
默认为false,表示本方维护关联关系。
如果为true,表示本方不维护关联关系。
只是影响是否能设置外键的值(设成有效值或者是null值),对获取信息没有影响
cascade属性:
默认为none,代表不级联。
级联是指操作主对象时,对关联的对象也做相同的操作
可设为:delete,save-update,all,none ...
lazy属性:懒加载,默认为true。
true:懒加载,在张一次使用时加载。
false:立即加载,在获取本对象时就加载这个集合的所有元素。
extra:增强的懒加载策略
-->
<set name="employee" cascade="all" lazy="true">
<key column="departmentId" />
<one-to-many class="Employee" />
</set>
</class>
</hibernate-mapping>
@Test
public void testLazy() throws Exception {
Session session = sessionFactory.openSession();
Transaction tx = null;
Department department = null;
try {
tx = session.beginTransaction();
// ------------------------------------
department = (Department) session.get(Department.class, 1);
System.out.println(department);
// System.out.println(department.getEmployee().size());
Hibernate.initialize(department.getEmployee());// 立即加载指定的懒加载对象
// ------------------------------------
tx.commit();
} catch (RuntimeException e) {
tx.rollback();
throw e;
} finally {
session.close();
}
// 在使用懒加载特性时,要注意LazyInitializationException异常
System.out.println(department.getEmployee());
}
在授权时需要立即加载,平时延迟加载