Hibernate_懒加载特性

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());
	}

在授权时需要立即加载,平时延迟加载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值