org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.future.egov.zhengxeq.zyxt.business.domain.personal.cadremove.AppointCadreMove.familyMembers, no session or session was closed
程序报了个这么异常。这是我的hbm文件
<hibernate-mapping package="com.future.egov.zhengxeq.zyxt.business.domain.personal.cadremove">
<class name="AppointCadreMove" table="pms_personnel_appointCadreMove">
<id name="id" column="ID_" length="32">
<generator class="uuid" />
</id>
<!-- 调干表 -->
[color=red]<set name="relocationPersons" cascade="all" inverse="false" fetch="select" lazy="true">
<key column="CADREMOVEID_"></key>
<one-to-many class="RelocationPerson"/>
</set>[/color] <many-to-one name="wife" column="WIFEID_" class="Wife" cascade="all" fetch="join" lazy="proxy" unique="true" ></many-to-one>
<!-- 任免表 -->
<set name="familyMembers" cascade="all" inverse="false" fetch="select" lazy="true">
<key column="APPOINTID_"></key>
<one-to-many class="FamilySocietymembers"/>
</set>
<many-to-one name="personInfor"
column="PERSONINFORID_"
class="PersonnelInformation"
fetch="join"
cascade="all"
lazy="false" >
</many-to-one>
</class>
</hibernate-mapping>code]
按照hibernate的说法fetch是select的话页面不加载模型.getSet的话就不会出现以上的懒加载异常。我找死找不到,最后竟然让我同事发现了。原来我页面当在渲染的时候用到了
rendered="#{!empty(infor.cadremoveEducationals)}"
infor是backbean的模型也就是说是seam的一个组件。哎。。大意了。
再说一说昨天搞笑的事,也可能是我这辈子遇见的第一个长篇懒加载异常。足足好几页大家不要见笑。
我们的需求是这样的xhtml页面上(我们用的是faceslet)当在单击新增按钮的时候就初始化了三个对象如下:
* 初始化调干
*/
public void initCadremove(ActionEvent event){
if(cadreMoveModel == null){
infor = new PersonnelInformation();
cadreMoveModel = new AppointCadreMove();
cadreMoveModel.setPersonInfor(infor);
wife = new Wife();
cadreMoveModel.setWife(wife);
}
}
当把form页面的书籍一填当在点击新增的时候没有包懒加载异常 :D 可是当你在单击提交按钮的时候就拉稀了。好长的懒加载拉稀。从没见过,那叫壮观。
后来发现我的many_to_one的hbm的fetch属性全部是fetch="select"把它改为join后就好了。这个select不是不用不加载嘛。页面上用的时候才加载嘛。希望大家当在处理many_to_one的关系的时候就一次把one的书籍取出怎么办把fetch的值改为join。就不会出现异常了。
再者:如果你把hbm里面的
<set name="familyMembers" cascade="all" inverse="false" fetch="join" lazy="true">
<key column="APPOINTID_"></key>
<one-to-many class="FamilySocietymembers"/>
</set>
fetch属性值为join的话那你就惨了。为啥呢?如果你修改表单的话你的表单里面的属性字段就比较多,而你的set集合里面的书籍也很多,就比如我们我们这个需求,父表里面就有三个集合当hibernate再查询父表的时候就把你那些set集合里面的书籍一块从数据库取出来了,然后把这些书籍放到hibernate缓存里面了。用户一多那就毙了。再者当你再查询父类列表的时候就会出现同样的一条数据出现在列表中多次。为啥?因为当hibernate在查询的时候用的是left join连接查询,大家要主意哟。
说了一大zui其实就一个事hibernate hbm fetch属性的应用。
在多对一用join值在set里面用select。
有啥意见的话大家一起讨论!偶了。
分享到:
相关推荐
在深入探讨Hibernate Fetch的作用之前,我们首先需要理解Hibernate框架本身以及其在持久化领域的重要性。Hibernate是一个开源的对象关系映射(ORM)框架,用于Java应用,它提供了将数据库记录映射到对象的方法,使得...
3. **Hibernate的Hibernate.initialize()方法**:在需要使用懒加载属性的地方,手动调用此方法初始化代理对象。但这需要在业务代码中显式处理,不够优雅。 4. **使用Hibernate的Criteria API或HQL查询**:在查询时...
hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法 Hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法是 Hibernate 框架中的一种常见问题。当我们在 Hibernate 中使用懒加载特性时,可能会遇到 ...
在Java的持久化框架Hibernate中,数据访问优化是至关重要的,而抓取策略(Fetch Strategy)和懒加载(Lazy Loading)则是实现这一目标的关键技术。本文将深入探讨这两个概念,并通过具体的案例进行分析。 首先,让...
标题"Hibernate教程15_关联关系中的CRUD Cascade_Fetch"主要关注两个核心概念:关联关系和它们在创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作中的级联(Cascade)以及懒加载和立即加载(Fetch...
hibernate.default_batch_fetch_size 参数用于设置 Hibernate 关联的批量抓取默认数量。其取值建议为 4、8 或 16。 9. hibernate.default_entity_mode hibernate.default_entity_mode 参数用于指定由这个 ...
7. **性能优化**:包括延迟加载(Lazy Loading)、批处理(Batch Processing)、缓存策略调整等,这些都可以提升Hibernate应用的性能。 8. **查询优化**:避免N+1查询问题,使用JOIN fetch提前加载关联数据,使用...
在使用Hibernate进行数据查询时,Fetch Size的设置对性能有着显著的影响。Fetch Size是指每次从数据库中取出的数据行数,默认情况下,Oracle数据库的JDBC驱动程序中的Fetch Size被设置为15。然而,将Fetch Size增加...
例如,通过设置合适的 `hibernate.max_fetch_depth` 和 `hibernate.default_batch_fetch_size` 可以显著提升应用性能;而启用 `hibernate.generate_statistics` 则有助于我们更好地监控和分析应用性能瓶颈。此外,...
在`hibernate_fetch_1`示例中,我们了解到Hibernate的加载策略,包括Eager Fetching(即时加载)和Lazy Fetching(延迟加载)。即时加载会在查询时一起加载关联的对象,而延迟加载则只在真正需要时才执行数据库查询...
根据提供的文件信息,我们可以深入探讨Hibernate框架中的几个关键概念,特别是`fetch`, `lazy`, `cascade`, 和 `inverse`关键字的使用与理解。这四个概念在处理对象关系映射(ORM)时非常重要,尤其是在Java环境下...
7. **`hibernate.max_fetch_depth`**:定义Hibernate执行外连接获取关联对象时的最大深度。 - 示例: ```properties hibernate.max_fetch_depth=3 ``` 8. **`hibernate.default_batch_fetch_size`**:定义默认...
例如,`hibernate_fetch_5`可能涉及了多对一、一对多、一对一等关联关系的懒加载实现。 2. **缓存策略(Cache Level)** `hibernate_cache_level_1`和`hibernate_cache_level_2`涉及到Hibernate的两级缓存机制。一...
《Hibernate完全参考手册》是Java开发领域中关于Hibernate框架的重要学习资源,主要涵盖了该框架的全方位知识。Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互,使得开发者...
在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种重要的对象关系映射策略,用于提高应用程序的性能。懒加载的基本思想是延迟加载,即当真正需要数据时,才去数据库加载。在这个场景中,我们关注的是...
9. **延迟加载(Lazy Loading)**:通过 `@OneToMany(mappedBy = "..." fetch = FetchType.LAZY)` 可以实现懒加载,只有在真正需要时才会加载关联的对象,避免了数据冗余。 10. **事件监听**:可以注册事件监听器,...
在fetch API没有内置拦截器的情况下,一种常见的做法是创建一个统一的请求函数,所有网络请求都通过这个函数进行。例如,在antd-pro项目中,可能会有一个封装好的fetch函数,负责处理如添加token、错误处理等操作。...
在JavaEE开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本项目“hibernate一对多项目”旨在演示如何在JavaWeb应用中使用Hibernate处理一对多的关系映射。这里我们将深入...
通过Hibernate,持久化操作变得简单。例如,使用`session.save()`或`session.persist()`来保存新对象,`session.update()`更新已存在的对象,`session.delete()`删除对象。此外,`session.load()`用于根据ID获取对象...
通过`@LazyCollection(LazyCollectionOption.EXTRA)`或`@OneToMany(mappedBy = "property", fetch = FetchType.LAZY)`等注解实现懒加载,以提高程序性能,只在真正需要时加载关联数据。 12. **事件监听(Event ...