加载策略
为了提高hibernate的效率,hibernate提供了两种加载策略来提高效率
及时加载: lazy:false 不管该对象是否使用都立刻加载
延时加载:lazy:true只有该对象使用才加载
注意:只有Session对象的load方法才可以设置加载策略 ,get方法永远都是及时加载
加载策略又分
类级别加载策略:判断是否加载类对象,不判断是否加载也该类关联的对象或集合。
关联级别加载策略:在加载对象的时候,判断是否加载该类关联的对象或集合。
一对多的关联级别加载策略
true:只有使用到该对象关联的集合或对象时才加载
false:在加载该对象时立刻加载关联的集合或对象
extra:只有使用到该对象关联的集合或对象时才加载,如果只是调用集合的size属性只是发送count(*)
多对一:
false:在加载对象的时候,立刻加载关联集合或对象
proxy:在加载对象的时候,看一的方的类加载级别,false立刻加载,true懒加载
</div> <div><hibernate-mapping package="b_lazy.one2many"></div> <div> <!--类级别加载策略 --></div> <div> <class name="User" table="t_user" lazy=false></div> <div> <id name="id" column="id"></div> <div> <generator class="native"></generator></div> <div> </id></div> <div> <property name="name" column="name"></property></div> <div> <property name="password" column="password" ></property></div> <div> <!--关联级别加载策略 --></div> <div> <set name="addresss" lazy= flase ></div> <div> <key column="user_id"></key></div> <div> <one-to-many class="Address" /></div> <div> </set></div> <div> </class></div> <div></hibernate-mapping></div> <div>
批查询
当用户关联地址,当我们获取到所有的用户的集合时候,遍历地址,懒加载情况下会获取一次加载一次,我们可以设置批查询来让他一次多加载几个
批量查询使用in语句减少查询订单语句个数。
默认:select * from t_address where address.user.id = ?
批量:select * from t_address where address.user.id in (?,?,?,?)
<set batch-size=”5″> 5表示括号中?代表加载个数。
</div> <div> <div><set name="addresss" cascade="all" batch-size="4"></div> <div> <key column="user_id"></key></div> <div> <one-to-many class="Address" /></div> <div> </set></div> <div>
懒加载异常
出现原因:在获取到懒加载的数据时没有使用,而对象解除session管理的情况下(关闭session或者clear,
evict等方法)再次使用对象
因为在数据是懒加载时,只有使用到该数据才会被加载
注意:关联级别懒加载异常容易被忽视
关联级别懒加载true
</div> <div>public void test1() throws Exception {</div> <div> Session session=HibernateUtil.getSession();</div> <div> session.beginTransaction();</div> <div></div> <div> User u=(User) session.get(User.class,1);//因为是关联级别懒加载为true,此时并不加载关联的集合或对象</div> <div></div> <div> session.clear();//清空session,此时对象不被session管理</div> <div> System.out.println(u.getAddress());//报错!</div> <div></div> <div> session.beginTransaction().commit();</div> <div> session.close();</div> <div> }</div> <div>
转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/24293.html
微信打赏
支付宝打赏
感谢您对作者Alex的打赏,我们会更加努力! 如果您想成为作者,请点我