一、立即检索
所谓立即检索就是立即装载和初始化检索方法指定的对象,即使Session关闭了,依然可以正常访问。立即检索策略的启用是通过在映射配置文件中将lazy实行值设置为false实现的。
通俗讲就是立即检索在加载时就把所有和主表关联的表加载到内存中,无论调不调用它们。
优点是快,缺点是占内存
注解上的使用方法:
1、在po层的调用对象上(例如父子关系中的主表父亲表)getSon方法上加上注解@Fetch(FetchMode.JOIN)
2、将load方法改为get方法
二、延迟检索(懒加载)
延迟检索是Hibernate3的默认检索策略,所谓延迟检索就是等到访问的时候才加载和初始化指定的对象,如果在Session实例关闭之前没有初始化延迟检索出来的对象,如果在Session实例关闭之前没有初始化延迟检索出来的对象,Session实例关闭后在访问时就会抛出异常。
优点是省内存,缺点是慢
三、解决延迟检索找不到数据的方法:
为了确保延迟检索的对象在Session关闭后仍能被正常访问,可以使用Hibernate的isInitialized(Object object)用于判断对象是否被初始化,再用initialize对指定的对象进行手动 初始化处理。
public void go(){ Father2 s=query(); s.getSons().forEach(s1->System.out.println(s1.getSname())); } public Father2 query(){ Session session=sf.openSession(); Father2 s=null; try { s=session.get(Father2.class,6); if(!Hibernate.isInitialized(s.getSons())){//lazy的必须解决方案,访问子表情况 Hibernate.initialize(s.getSons()); } }catch(Exception e){ e.printStackTrace(); } session.close(); return s; }
以上代码就是在query中虽然开了对话session,可是并没有自动加载son的内容,之后就关闭了对话,而在go方法中却要使用son中的内容。这时就需要使用try中的判断来手动创建一个son对象。
开发时候一般使用懒加载。