- 浏览: 329611 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (211)
- Java IO (3)
- Struts (13)
- Hibernate (19)
- Spring (9)
- jQuery (2)
- Extjs (8)
- Flex (1)
- Oracle (4)
- ibatis (3)
- SQL (0)
- WorkFlow (0)
- Java Core (14)
- Ant&Maven (18)
- Java Thread (0)
- Java Socket (1)
- Java OO (2)
- Javascript (14)
- CSS&Div (2)
- MYSQL (3)
- MSSQL (0)
- Design Pattern (3)
- Data Structure&Algorithm (1)
- Source Analysis (0)
- OSGi (3)
- Linux (7)
- Network (1)
- 百无聊赖 (9)
- English (5)
- Japaness (0)
- French (0)
- Webservice (3)
- 考试认证 (0)
- C/C++ (1)
- 小题目 (1)
- Server (1)
- JSP&Servlet (18)
- JDBC (8)
- JMS (3)
- JNDI (0)
- 软件工程 (2)
- 项目管理 (2)
- UML (0)
- 文档翻译 (0)
- 架构之美 (1)
- EJB (0)
- DataBase Design (1)
- DataBase (1)
- Framework Integration (2)
- JPA (2)
- Daily Reading (8)
- 通用组件设计 (3)
- Spring DM (1)
- Spring MVC (0)
- Spring Security (0)
- 时间管理 (0)
- 成本管理 (1)
- 进度管理 (0)
- 质量管理 (0)
- 范围管理 (0)
- 环境配置 (5)
- 敏捷开发 (0)
- DB2 (2)
- 持续集成 (1)
- JVM性能调优 (2)
- Weblogic (0)
- PHP (1)
- Websphere (2)
最新评论
-
di1984HIT:
写的很好,谢谢。。
【转载】【权限控制】角色访问动态生成用户权限菜单树 -
paladin1988:
wangxuehui 写道我昨天也参加视频面试,视频面试2个人 ...
阿里巴巴面试感想 -
wangxuehui:
我昨天也参加视频面试,视频面试2个人,最后都听我说完啦,最后我 ...
阿里巴巴面试感想 -
paladin1988:
liwei113114 写道请问一下,你们最后是怎么解决tld ...
OSGi动态拔插,动态部署,动态权限菜单 -
liwei113114:
请问一下,你们最后是怎么解决tld那个问题的?
我现在也遇到这 ...
OSGi动态拔插,动态部署,动态权限菜单
什么时候会遇到1+N的问题?
前提:Hibernate默认表与表的关联方法是fetch="select",不是fetch="join",这都是为了懒加载而准备的。
1)一对多(<set><list>) ,在1的这方,通过1条sql查找得到了1个对象,由于关联的存在 ,那么又需要将这个对象关联的集合取出,所以合集数量是n还要发出n条sql,于是本来的1条sql查询变成了1 +n条 。
2)多对一<many-to-one> ,在多的这方,通过1条sql查询得到了n个对象,由于关联的存在,也会将这n个对象对应的1 方的对象取出, 于是本来的1条sql查询变成了1 +n条 。
3)iterator 查询时,一定先去缓存中找(1条sql查集合,只查出ID),在没命中时,会再按ID到库中逐一查找, 产生1+n条SQL
怎么解决1+N 问题?
1 )lazy=true, hibernate3开始已经默认是lazy=true了;lazy=true时不会立刻查询关联对象,只有当需要关联对象(访问其属性,非id字段)时才会发生查询动作。
2)使用二级缓存, 二级缓存的应用将不怕1+N 问题,因为即使第一次查询很慢(未命中),以后查询直接缓存命中也是很快的。刚好又利用了1+N 。
3) 当然你也可以设定fetch="join",一次关联表全查出来,但失去了懒加载的特性。
【以上内容为转载,如果侵犯了你的权益请及时与我联系】
==================== 蟀锅分界线 =========================
给出一个 1+N问题的代码,大家可以去调试一下,看看sql的输出效果
public class HibernateTest { public static void main(String[] args) { //产生1+N问题 query(); //统计总数 getTotal(); } //由于iterator()的缓存特性 //先从category表中读取idList,然后到二级缓存中 //如果二级缓存中不存在,则分别得idList中发出n条sql到数据库中查询 public static void query() { Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tx = session.getTransaction(); tx.begin(); Query query = session.createQuery(" from Category"); Iterator<Category> it = query.iterate(); while(it.hasNext()) { Category cat = it.next(); System.out.println(" name = " + cat.getName() + " , description = " + cat.getDescription()); } } //获取记录总数 public static void getTotal() { Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tx = session.getTransaction(); tx.begin(); Query query = session.createQuery(" select count(cat.id) from Category cat "); System.out.println(" Category 共有记录数 total = " + ((Number)(query.iterate().next())).intValue()); } }
发表评论
-
Hibernate非空属性保存异常
2013-05-21 13:24 1249错误描述: Caused by: org.hi ... -
Hibernate读取错误
2013-05-21 13:22 806错误如下: Caused by: com.da ... -
【转】The user must supply a JDBC connection
2012-08-27 01:12 3362The user must supply a JDBC con ... -
Hibernate Annotation小记
2012-08-22 23:43 908老实说,Hibernate Annotation用起来 ... -
Hibernate Annotation 基于外键的一对多双向关联
2012-08-22 23:44 4187纠结了好久呀,因为没有set,关联关系没有保存对,导致插入数据 ... -
【转】Hibernate中的"Repeated column in mapping for entity"异常
2012-08-21 10:31 984文章来源:http://www.iteye.com/t ... -
Hibernate Annotation 唯一外键一对一双向关联
2012-08-20 22:38 1089继续上面的东西,修改下数据库脚本,把共享主键中的Pro ... -
【转】attempted to assign id from null one-to-one
2012-08-20 21:59 843one-to-one在hibernate中可以用来作为两张 ... -
Hibernate Annotation 共享主键一对一双向关联
2012-08-20 21:59 5978写了这么几篇都是单向的关联,干脆后面的都写双向关联吧, ... -
Hibernate Annotation 基于连接表的单向一对多关联
2012-08-17 00:29 2267趁着今晚把一对多一起搞了吧,呵呵。。 一对多的关 ... -
Hibernate的一对多关联方式
2012-08-17 00:29 855之前阅读Hibernate reference的时候看 ... -
Hibernate Annotation 基于外键的单向一对多关联
2012-08-17 00:30 1551基于外键关联的单向一对多关联是一种很少见的情况,并不推荐使用。 ... -
Hibernate Annotation 基于外键的单向多对一关联
2012-08-16 01:26 2922其实一对多和多对一是一样的,只是看问题的角度不同。 ... -
Hibernate Annotation入门
2012-08-15 19:40 1612废话不多说,直接上例子(附件) 数据库脚本: ... -
【转】Hibernate获取记录总数
2012-08-13 20:41 1149hql获取记录条数 Str ... -
Hibernate基于连接表的一对多单向关联
2012-08-09 23:13 1463基于连接表,顾名思义就是需要建立中间表来保存两个表的关联关系。 ... -
Hibernate基于外键的一对多单向关联
2012-08-09 21:42 2019一对多,一个分类Category下有多个Product,从Ca ... -
Hibernate使用注解
2012-08-04 01:37 1073//类标志 @Entity @Table(name = & ...
相关推荐
- 故障排查和性能优化:讨论常见问题及解决办法,如N+1查询问题,以及如何优化Hibernate查询性能。 通过本教案的学习,你将能够熟练掌握数据库的基本操作,理解Hibernate的核心功能,以及如何利用AJAX提升Web应用...
Hibernate支持1:1、1:n、n:m等多种关联映射关系,可以有效地管理复杂的数据关系。 在Hibernate框架中,ORM模型简化了数据库查询的过程,开发者可以利用ORM框架提供的查询接口,以对象的方式操作数据,而无需深入...
- 合理设计数据结构,避免N+1查询问题。 - 选择合适的缓存策略,如查询缓存、集合缓存等。 综上所述,Hibernate通过提供ORM服务,简化了Java应用与数据库之间的交互,降低了开发难度。理解和掌握Hibernate的这些...
9. **测试与优化**:通过单元测试确保所有功能正常工作,同时考虑性能优化,如合理使用缓存、避免N+1查询问题等。 对于SSH初学者,理解并掌握这些基本概念和步骤至关重要。实践中可能会遇到各种问题,例如配置错误...
- 动态加载策略:选择合适的懒加载和立即加载策略,避免N+1查询问题。 总之,导入Hibernate源码到Eclipse中,不仅有助于我们深入理解ORM的工作原理,还能提升我们的数据库操作和设计能力。通过实际操作和调试,...
为了提升性能,Hibernate提供了多种优化手段,如:批处理(Batch Processing)、预加载(Preloading)、缓存策略调整、避免N+1查询问题等。理解并运用这些技巧,可以在保证代码简洁的同时,提升应用性能。 通过深入...
- 笔记可能涵盖了实际开发中遇到的问题、解决方案、性能优化技巧以及最佳实践,如批处理操作、避免N+1查询等。 - 可能会包含对复杂关联关系的处理,如多对一、一对多、多对多关系的映射。 - 可能涉及到Hibernate...
同时,合理设计实体类的懒加载策略,避免N+1查询问题,也是优化的重要环节。 六、总结 Hibernate作为Java领域广泛使用的ORM框架,极大地简化了Java应用的数据库操作,使得开发者能更专注于业务逻辑。然而,理解和...
10. **延迟加载(Lazy Loading)**:为了解决N+1问题,Hibernate提供了延迟加载机制,只有当真正需要访问关联对象时,才会去数据库加载。 通过`HibernateDemo`这个项目,你可以学习如何配置Hibernate,创建实体类,...
通过合理设置缓存策略、优化查询、避免N+1查询、使用批处理等方法,可以显著提升Hibernate应用的性能。 通过深入研究Hibernate源码,我们可以更好地理解ORM的工作原理,从而在项目实践中更好地运用Hibernate,提高...
9. 性能优化:讲解如何通过调整Hibernate配置、优化查询、缓存策略等手段提高应用性能,避免N+1查询问题,减少数据库访问次数。 10. 实战案例:通过实际的项目案例,演示如何在实际开发中应用Hibernate,解决常见的...
9. **最佳实践**:在实际项目中,我们还需要遵循一些最佳实践,如合理设计数据模型,避免N+1查询,使用第一级缓存和第二级缓存提高性能,以及使用事务边界来保证数据一致性。 综上所述,"Spring+Hibernate实例"涵盖...
3. 精细控制查询:避免N+1查询问题,合理使用JOIN,避免过多的子查询。 总结,Hibernate 5.2.10提供了一套完整的持久化解决方案,简化了Java应用程序与数据库的交互。通过理解和掌握其核心概念、API用法及最佳实践...
优化Hibernate应用包括合理设计实体关系、避免N+1查询问题、使用批处理和预加载、以及调整缓存策略。同时,了解和使用Hibernate的事件监听器、拦截器也能进一步提升性能。 **八、JPA集成** Java Persistence API...
这通常通过代理对象实现,避免了“n+1”查询问题,提高了性能。 通过研究Hibernate 3.3的源码,开发者不仅可以了解ORM的内部运作,还可以学习到设计模式的应用,如工厂模式、单例模式和代理模式等。此外,源码分析...
国际化(i18n)则涉及如何支持多种语言,而防止重复提交是Web开发中的重要问题,Struts2提供了一种解决方案。 2. **Hibernate**:Hibernate是一个对象关系映射(ORM)框架,简化了数据库操作。`day57_hibernate_多...
4. 查询优化:合理使用HQL或Criteria,避免N+1查询问题。 八、源代码分析 深入研究Hibernate源代码,可以帮助我们理解其内部机制,如: - Session的实现原理,包括对象的保存、更新、删除操作。 - Query和Criteria...
了解如何优化Hibernate,包括批处理、合理使用缓存、避免N+1查询问题、减少无效的数据库访问等策略。 通过阅读压缩包中的`Hibernate原理与配置快速入门.pdf`和`Hibernate_DEV_GUIDE.pdf`,你可以深入了解Hibernate...
10. **查询优化**:分析Hibernate如何生成SQL语句,理解查询优化技巧,如避免N+1查询,使用JOIN fetch提前加载关联数据等。 11. **第二级缓存和查询缓存**:深入第二级缓存的实现,包括查询缓存,可以优化大规模...
5. **查询优化**:避免N+1查询问题,合理使用JOIN,减少数据库交互次数。 学习Hibernate不仅可以提升开发效率,还能增强软件的可维护性和性能。通过深入理解O/R Mapping原理,熟练运用Hibernate的特性,可以更好地...