Hibernate中常会用到set,bag等集合表示1对多的关系, 在获取实体的时候就能根据关系将关联的对象或者对象集取出, 还可以设定cacade进行关联更新和删除。这不得部说hibernate的orm做得很好,很贴近oo的使用习惯了。
但是对数据库访问还是必须考虑性能问题的, 在设定了1对多这种关系之后, 查询就会出现传说中的n+1问题。
1)1对多,在1方,查找得到了n个对象, 那么又需要将n个对象关联的集合取出,于是本来的一条sql查询变成了n+1条
2)多对1,在多方,查询得到了m个对象,那么也会将m个对象对应的1方的对象取出, 也变成了m+1
怎么解决n+1问题?
1)lazy=true, hibernate3开始已经默认是lazy=true了;lazy=true时不会立刻查询关联对象,只有当需要关联对象(访问其属性,非id字段)时才会发生查询动作。
2)二级缓存, 在对象更新,删除,添加相对于查询要少得多时, 二级缓存的应用将不怕n+1问题,因为即使第一次查询很慢,之后直接缓存命中也是很快的。
不同解决方法,不同的思路,第二条却刚好又利用了n+1。
-----------------------------------------------
Hibernate的两个类设置了manyToOne之后,在查询的时候,由于N 对1的一方默认的fetch=FetchType.EAGER,所以会把被关联的对象一起取出来
解决方法一:设置fetch=FetchType.LAZY
解决方法二:
//List<Student> students= (List<Student>)session.createCriteria(Student.class).list();
List<Student> students= (List<Student>)session.createQuery("from Student").list();
也就是用session.createCriteria()做查询,而不是用createQuery
分享到:
相关推荐
- 懒加载(Lazy Loading):默认情况下,Hibernate对1:N或N:1关联使用懒加载策略。这意味着主对象被加载时,其关联的对象不会立即加载,而是在第一次访问关联对象时才发起数据库查询。 - 急加载(Eager Loading)...
**标题:“Hibernate N+1问题解决办法”** 在Java开发中,使用Hibernate作为ORM框架时,我们可能会遇到一个性能上的问题,那就是著名的“N+1查询问题”。此问题源于不恰当的数据加载策略,可能导致数据库查询效率...
- 但同时也可能导致“N+1”问题,即除了主表查询外,还需要额外的查询来加载每个关联的子记录,这在子记录较多时可能会导致性能下降。 **2. FetchType.LAZY:** - `LAZY`加载方式则是延迟加载,即只有当真正访问到...
《理解Hibernate中的N+1问题及其解决方案》 在Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了数据库操作。然而,使用不当可能会导致性能瓶颈,其中最典型的就是“N+1次SELECT查询问题...
HIBERNATE的N+1查询问题 关联查询时
Struts2+hibernate4+layui+mysql简单的网站后台管理系统 项目描述 简单的网站后台管理系统 运行环境 jdk7+tomcat7+mysql+myeclipse 项目技术(必填) struts2+hibernate4+layui+jquery+jstl 数据库文件 src根...
浅谈Hibernate n+1问题 Hibernate 是一个基于Java的持久层框架,它提供了对数据库的访问和管理功能。在使用 Hibernate 进行数据访问时,经常会遇到一个问题,即 n+1 问题。该问题是指在一次数据库查询中,需要执行...
精通HibernateJava对象持久化技术详解(第2版)jar文件.zip) annotations-api.jar antlr-2.7.6.jar catalina-ant.jar catalina-ha.jar catalina-tribes.jar catalina.jar commons-collections-3.1.jar commons-...
标题 "如何解决Hibernate的N+1问题" 涉及的是一个常见的数据库查询优化问题,主要出现在使用Hibernate等ORM框架时。N+1问题是指在进行一对多或多对多关联查询时,原本期望通过一次SQL查询获取所有数据,但实际执行了...
1. 创建新项目:Ctrl + N,打开新建项目向导,选择相应类型进行创建。 2. 代码补全:Ctrl + Space,快速提示并插入代码,适用于Java、XML等多种语言。 3. 查找/替换:Ctrl + F,快速查找和替换文本。 4. 重构:Alt +...
而查询优化则涉及避免N+1查询问题,合理使用JOIN和子查询。 最后,实战案例和项目经验分享将帮助读者将理论知识转化为实际开发技能。这可能包括创建RESTful API、处理并发问题、设计复杂的业务流程等场景,让读者...
问题 1:批量处理 在 Hibernate 中,如果我们需要批量处理大量数据,例如插入 1000 000 条记录,就会出现 OutOfMemoryException 异常。这是因为 Hibernate 的 Session 有一个一级缓存,会将所有对象存储在内存中。...
1. **Struts2.3.6**:这是一个基于MVC设计模式的Java Web框架,用于构建可维护性高、结构清晰的Web应用。Struts2提供了强大的动作类、拦截器、结果类型和模板技术,使得开发者能够更方便地处理请求和响应。 2. **...
5. **查询优化**: 避免N+1查询问题,合理使用JOIN,减少数据库交互次数。 **六、源码分析** `hibernate_test`、`hibernate_test3`、`hibernate_test2`这些文件可能包含了示例项目的源代码,包括配置文件、实体类、...
国际化(i18n)则涉及如何支持多种语言,而防止重复提交是Web开发中的重要问题,Struts2提供了一种解决方案。 2. **Hibernate**:Hibernate是一个对象关系映射(ORM)框架,简化了数据库操作。`day57_hibernate_多...
在"hibernateORM1-n映射"这个主题中,我们将深入探讨Hibernate中的一对多(1:N)映射关系。 在关系数据库中,一对多关系是指一个表中的记录可以对应另一个表中的多个记录。在Hibernate中,这种关系可以通过配置XML...
- 合理设计实体关系,避免N+1查询问题。 - 优化查询,减少无谓的数据库访问。 10. **集成Spring**: Hibernate与Spring框架集成,可以使用Spring的事务管理,进一步简化代码,提高代码的可维护性。 综上,...
- **国际化(Internationalization, i18n)**:Struts 2提供了强大的i18n支持,方便多语言环境下的应用开发。 - **Tiles布局**:集成Tiles框架可以实现页面模板化,提高页面设计的复用性。 2. **Hibernate ORM**...
以及开放 session 在视图(Open Session In View,OSIV)模式,确保在Web请求生命周期内保持一个持久化上下文,避免N+1查询问题。 总结来说,本教程涵盖了Hibernate的基础知识,从入门到实体映射,再到复合主键和...