转自:http://www.qingsoft.net/bbs/html/article/1175.jhtml
用户和角色
用户User中有Set<Role> roles = new HashSet<Role>(0);
当得到User中的roles集合时,会出现下面的异常:
Java代码
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.demo.security.entity.User.roles, no session or session was closed
1. 当时我的解决是:
UserDAOImpl.java
Java代码
@SuppressWarnings("unchecked")
public List<User> queryAll(final Integer isInitialize) {
return getHibernateTemplate().executeFind(new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query q = session.createQuery("from User u left join fetch u.userInfo");
if(isInitialize == 0) return q.list();
else{
List<User> users = q.list();
for(User user : users){
if(isInitialize ==1)
getHibernateTemplate().initialize(user.getRoles());
}
return users;
}
return q.list();
}});
}
感觉这样写比较麻烦,觉得效率上也不高。
2. 看到网上有的是把lazy=false,在Hibernate Annotation中也这样的(注意红色部分)
Java代码
@ManyToMany(
targetEntity = Role.class,
cascade = {CascadeType.PERSIST, CascadeType.MERGE},
fetch = FetchType.EAGER)
@JoinTable(
name = "User_Role",
joinColumns = {@JoinColumn(name = "User_Id")},
inverseJoinColumns = {@JoinColumn(name = "Role_Id")})
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public Set<Role> getRoles() {
return roles;
}
要是这样,效率更是糟糕(不管要不要某个数据,都会查询出来,很是浪费)
最后看了篇文章:
就是使用filter,过滤所有的链接
如果在使用filter的时候,要配置事务处理,否则会导致session处于只读状态而不能做修改、删除的动作
web.xml
XML/HTML代码
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
上面的fetch = FetchType.EAGER 改成 fetch = FetchType.LAZY
是这样解释的:
Spring为我们解决最让人头痛的难题之一,Hibernate的Session的关闭与开启问题。
Hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。而Spring为我们提供的OpenSessionInViewFilter过滤器为我们很好的解决了这个问题。OpenSessionInViewFilter的主要功能是使每个请求过程绑定一个 Hibernate Session,即使最初的事务已经完成了,也可以在 Web 层进行延迟加载的操作。OpenSessionInViewFilter 过滤器将 Hibernate Session 绑定到请求线程中,它将自动被 Spring 的事务管理器探测到。所以 OpenSessionInViewFilter 适用于 Service 层使用HibernateTransactionManager 或 JtaTransactionManager 进行事务管理的环境,也可以用于非事务只读的数据操作中。
request-->open session-->打开连接、开始事务-->持久操作-->渲染(关闭连接、session)-->response
其中一些过程省略了,不是很关心。
不知道这是不是比较好的解决办法?等待各位老师和同学发表自己的看法。
本文来自:青软培训(www.qingsoft.net)原文链接:http://www.qingsoft.net/bbs/html/article/1175.jhtml
分享到:
相关推荐
Hibernate的延迟加载(Lazy Loading)和懒加载机制(Lazy Initialization)是优化ORM框架性能的重要策略。这个机制的主要目的是提高程序的效率,减少不必要的数据库交互,只在真正需要数据时才去加载它们。以下是对...
### Hibernate延迟加载深入解析 #### 一、概念与原理 **延迟加载**(Lazy Loading)是Hibernate框架中的一个重要特性,主要用于优化数据库操作,减少不必要的数据加载,从而提升应用程序的性能。在传统的Eager ...
本文将深入探讨几种解决Flex与Hibernate延迟加载问题的方法,并着重讲解使用Gilead的方案。 1. **LCDS的Hibernate Adapter**:Adobe LiveCycle Data Services (LCDS) 提供了一个Hibernate适配器,可以处理延迟加载...
Hibernate延迟检索的原理 ##### 实体对象的延迟加载 实体对象的延迟加载是指当真正需要某个实体对象的数据时,才执行数据加载操作。在Hibernate中,可以通过在实体的映射配置文件中设置`lazy="true"`来启用实体...
4. **懒加载异常**:在脱离Session时尝试访问延迟加载属性,会出现“LazyInitializationException”。 5. **对象状态异常**:如 detached(分离)状态的对象试图更新,可能导致“DetachedObjectException”。 二、...
理解Hibernate的工作原理,尤其是其对关联管理和延迟加载的策略,对于排查这类问题至关重要。同时,利用IDE的调试器查看对象状态,以及使用日志输出来追踪执行流程也是必不可少的。 总之,理解和处理Hibernate的...
7. **性能优化**:包括延迟加载(Lazy Loading)、批处理(Batch Processing)、缓存策略调整等,这些都可以提升Hibernate应用的性能。 8. **查询优化**:避免N+1查询问题,使用JOIN fetch提前加载关联数据,使用...
这个版本进一步提升了性能和稳定性,对JPA 2.1规范进行了兼容,增加了对延迟加载和实体图形的深度遍历的支持。它还引入了对Java 8特性的支持,比如日期和时间API的改进。在多线程和并发处理方面也做了优化,提供了更...
然而,如果在没有开启 Session 的情况下尝试访问延迟加载的属性,就会出现“no session”错误。为了避免这个问题,可以关闭特定属性的延迟加载(在映射文件中设置 lazy="false"),或者使用 Spring 的 ...
10. **性能优化**:教程可能涵盖如何优化Hibernate,例如批量操作、延迟加载、缓存策略调整、避免N+1查询问题等。 11. **实例分析**:通过实际项目案例,演示如何在Web应用(如Spring Boot)中整合Hibernate,解决...
Hibernate提供了延迟加载机制,可以在真正需要数据时才将其加载到内存中,从而节省服务器的内存开销。Hibernate的延迟加载机制可以分为两种: 1. 实体对象的延迟加载 2. 集合的延迟加载 Hibernate的映射关系 ...
懒加载(Lazy Loading)策略则允许延迟加载关联对象,直到真正需要它们时才从数据库中获取,有效避免了内存消耗。 集合映射是Hibernate的另一个重要特性,它允许将数据库表的一对多或多对多关系映射到Java集合。...
9. **延迟加载**: Hibernate的懒加载机制允许在需要时才加载关联对象,以优化性能。 10. **生命周期**: Hibernate对象有三种状态:瞬态、托管和持久化,分别对应对象的创建、与Session关联以及被持久化到数据库的...
“Hibernate高级特性.pdf”这本书可能深入探讨了Hibernate的高级功能,如第二级缓存、Cascading和Association Management、一对一、一对多、多对一、多对多的关联关系处理、双向关联的维护,以及延迟加载和立即加载...
2. **javassist.jar**:Hibernate 使用 JavaAssist 库来动态生成代理类和字节码,这对于实现延迟加载和透明持久化非常关键。 3. **jta.jar** 或 **javax.transaction-api.jar**:用于支持 Java 事务 API,使得 ...
7. **性能优化**:讲解如何针对特定场景优化Hibernate的使用,如延迟加载、批处理、连接池配置,以及避免N+1查询问题等。 8. **Hibernate与其他技术的整合**:介绍Hibernate如何与Spring框架、EJB、Web应用等进行...
在Hibernate中,集合属性的加载方式有两种:即刻加载(eager loading)和延迟加载(lazy loading)。默认情况下,Hibernate采用即刻加载的方式加载集合属性。这种方式虽然简化了代码编写,但可能会导致额外的数据库...
7. **性能优化**:该版本中,Hibernate针对查询性能进行了优化,例如延迟加载(Lazy Loading)策略,只在真正需要时加载关联对象,降低了内存消耗。 8. **事件监听器**:Hibernate 4.1.2引入了事件监听机制,可以...
12. **懒加载与立即加载**: Hibernate支持懒加载和立即加载策略,懒加载可以延迟关联对象的加载,减少不必要的数据库查询,提高性能。 以上就是关于Hibernate 5.3框架环境配置的基本知识点,具体代码示例可能包括...
7. 高级特性:涵盖缓存策略、延迟加载、性能优化、二级缓存的配置与使用等。 8. 集成与扩展:如何将Hibernate与其他Java EE技术进行整合,例如Spring框架。 在Hibernate3中文参考手册中,这些内容会通过示例代码、...