`
阅读更多

一。   inverse = ?

           inverse=false(default)

               用于单向one-to-many关联

               parent.getChildren().add(child) // insert child

               parent.getChildren().delete(child) // delete child

            inverse=true

                       用于双向one-to-many关联

                       child.setParent(parent); session.save(child) // insert child

                        session.delete(child)

             在分层结构的体系中

              parentDao, childDao对于CRUD的封装导致往往直接通过session接口持久化对象,而很少通过关联对象可达性

 

二。 one-to-many关系

                 单向关系还是双向关系?

                      parent.getChildren().add(child)对集合的触及操作会导致lazy的集合初始化,在没有对集合配置二级缓存的情况下,应避免此类操作

                    select * from child where parent_id = xxx;

           性能口诀:

                   1.   一般情况下避免使用单向关联,尽量使用双向关联

                   2.   使用双向关联,inverse=“true”

                   3.   在分层结构中通过DAO接口用session直接持久化对象,避免通过关联关系进行可达性持久化

 

 

三。many-to-one关系

          单向many-to-one表达了外键存储方

          灵活运用many-to-one可以避免一些不必要的性能问题

          many-to-one表达的含义是:0..n : 1,many可以是0,可以是1,也可以是n,也就是说many-to-one可以表达一对多,一对一,多对一关系

           因此可以配置双向many-to-one关系,例如:

                 1.    一桌四人打麻将,麻将席位和打麻将的人是什么关系?是双向many-to-one的关系

 

四。one-to-one

             通过主键进行关联

             相当于把大表拆分为多个小表

             例如把大字段单独拆分出来,以提高数据库操作的性能

             Hibernate的one-to-one似乎无法lazy,必须通过bytecode enhancement

 

五。集合List/Bag/Set 

             one-to-many

                1.     List需要维护index column,不能被用于双向关联,必须inverse=“false”,被谨慎的使用在某些稀有的场合

 

                2.       Bag/Set语义上没有区别

                3.        我个人比较喜欢使用Bag

            many-to-many

                1.       Bag和Set语义有区别

                2。    建议使用Set

 

六。集合的过滤

              1.   children = session.createFilter(parent.getChildren(), “where this.age > 5 and    this.age < 10”).list()

          针对一对多关联当中的集合元素非常庞大的情况,特别适合于庞大集合的分页:

                    session.createFilter(parent.getChildren(),“”).setFirstResult(0).setMaxResults(10).list();

 

七。继承关系当中的隐式多态

            HQL: from Object

              1.      把所有数据库表全部查询出来

               2.      polymorphism=“implicit”(default)将当前对象,和对象所有继承子类全部一次性取出

               3.       polymorphism=“explicit”,只取出当前查询对象

 

八。Hibernate二级缓存

               著名的n+1问题:from Child,然后在页面上面显示每个子类的父类信息,就会导致n条对parent表的查询:

                    select * from parent where id = ?

                    .......................

                    select * from parent where id = ?

               解决方案

                         1.       eager fetch

                          2.       二级缓存

 

九。inverse和二级缓存的关系

             当使用集合缓存的情况下:

                  1.      inverse=“false”,通过parent.getChildren()来操作,Hibernate维护集合缓存

                   2.     inverse=“true”,直接对child进行操作,未能维护集合缓存!导致缓存脏数据

                   3.     双向关联,inverse=“true”的情况下应避免使用集合缓存

 

十。Hibernate二级缓存是提升web应用性能的法宝

               OLTP类型的web应用,由于应用服务器端可以进行群集水平扩展,最终的系统瓶颈总是逃不开数据库访问;

 

            哪个框架能够最大限度减少数据库访问,降低数据库访问压力,哪个框架提供的性能就更高;针对数据库的缓存策略:

                     1.         对象缓存:细颗粒度,针对表的记录级别,透明化访问,在不改变程序代码的情况下可以极大提升web应用的性能。对象缓存是ORM的制胜法宝。

                     2.        对象缓存的优劣取决于框架实现的水平,Hibernate是目前已知对象缓存最强大的开源ORM

                     3.         查询缓存:粗颗粒度,针对查询结果集,应用于数据实时化要求不高的场合

 

十一。应用场合决定了系统架构

一、是否需要ORM

Hibernate or iBATIS?

二、采用ORM决定了数据库设计

             Hibernate:

                     倾向于细颗粒度的设计,面向对象,将大表拆分为多个关联关系的小表,消除冗余column,通过二级缓存提升性能(DBA比较忌讳关联关系的出现,但是ORM的缓存将突破关联关系的性能瓶颈);Hibernate的性能瓶颈不在于关联关系,而在于大表的操作

             iBATIS:

                     倾向于粗颗粒度设计,面向关系,尽量把表合并,通过表column冗余,消除关联关系。无有效缓存手段。iBATIS的性能瓶颈不在于大表操作,而在于关联关系。

 

 

总结:

      性能口诀

                1、使用双向一对多关联,不使用单向一对多

                2、灵活使用单向多对一关联

                3、不用一对一,用多对一取代

                4、配置对象缓存,不使用集合缓存

                5、一对多集合使用Bag,多对多集合使用Set

                6、继承类使用显式多态

                7、表字段要少,表关联不要怕多,有二级缓存撑腰

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/QJC13/archive/2009/03/17/3997882.aspx

分享到:
评论

相关推荐

    Struts2 Spring Hibernate IBatis

    Struts2 Spring Hibernate IBatis Struts2 Spring Hibernate IBatis Struts2 Spring Hibernate IBatis Struts2 Spring Hibernate IBatis Struts2 Spring Hibernate IBatisStruts2 Spring Hibernate IBatisStruts2 ...

    Spring hibernate ibatis 开发指南三合一

    在IT行业中,Spring、Hibernate和iBatis是Java企业级应用开发中不可或缺的三大框架,它们各自专注于不同的领域,但可以协同工作以构建强大的数据驱动应用程序。本指南将围绕这三大框架,帮助初学者理解它们的核心...

    夏昕的3部开发手册(Hibernate Ibatis Spring)

    《夏昕的3部开发手册》是一套针对Java开发者的重要参考资料,主要涵盖了三大热门框架——Hibernate、Ibatis和Spring的深度解析。这三者在Java企业级应用开发中扮演着核心角色,是构建高效、可扩展后端服务的基石。 ...

    Hessian RPC-RMI技术 整合Structs Spring Hibernate Ibatis

    本文主要讨论的是如何将Hessian RPC与RMI技术整合到Structs、Spring、Hibernate和Ibatis这四个关键的Java开发框架中,以构建一个高效、灵活的分布式应用程序。 1. **Hessian配置说明**: Hessian的配置通常涉及...

    spring与hibernate以及ibatis集成的实例和具体配置图解

    在IT行业中,Spring、Hibernate和Ibatis是三个非常重要的框架,它们各自在不同的领域发挥着重要作用。Spring是一个全面的后端开发框架,提供依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等功能;...

    Struts Hibernate Ibatis Spring RAD WID

    -- Be familiar with popular web development frameworks and tools, such as Struts, Spring, Hibernate. -- Good knowledge of database systems and development. -- Familiar with DB2 development tools and ...

    springmvc_hibernate_ibatis_jdbc

    标题中的"springmvc_hibernate_ibatis_jdbc"指的是一个整合了SpringMVC、Hibernate、iBatis和JDBC这四种关键技术的Java应用框架。这个框架旨在提供一个全面且强大的解决方案,便于开发人员进行Web应用程序的构建。 ...

    struts1+spring+hibernate+ibatis集成

    Struts1、Spring、Hibernate和iBatis是Java Web开发中的四大框架,它们共同构建了一个强大的后端架构,用于处理复杂的企业级应用。这个集成方案旨在优化开发流程,提高代码的可维护性和可扩展性。 Struts1是MVC...

    开发指南(spring,hibernate,ibatis,webwork)

    【开发指南(spring,hibernate,ibatis,webwork)】 在软件开发领域,Spring、Hibernate、iBatis和WebWork是四个重要的框架,它们分别在不同的层面为开发者提供了便利。下面将对这些框架进行详细阐述。 1. **Spring...

    iBatisVSHibernate

    iBatis VS Hibernate iBatis不亚于Hibernate

    Spring MVC+Hibernate&Ibatis学习 例子 教程

    Spring MVC、Hibernate和iBatis是Java开发中常用的三大框架,它们在Web应用程序开发中各自承担着不同的职责。本教程将深入探讨这三个框架的核心概念、使用方法以及它们之间的协同工作。 **Spring MVC** 是Spring...

    ibatis3 jar

    描述中的"spring hibernate ibatis 3"提到了其他两个流行的Java开发框架——Spring和Hibernate。Spring是一个全面的后端开发框架,包括依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等特性,而Hibernate...

    iBatis和Hibernate的区别

    ### iBatis与Hibernate的主要区别 #### 一、概述 iBatis与Hibernate都是Java领域内流行的ORM(Object-Relational Mapping,对象关系映射)框架,用于简化Java应用程序与数据库之间的交互。尽管它们有着相似的目标,...

    struts2+hibernate+ibatis整合

    Struts2、Hibernate和iBatis是Java Web开发中三个非常重要的开源框架,它们分别用于MVC(模型-视图-控制器)架构、对象关系映射(ORM)和SQL映射。将这三个框架整合在一起可以构建高效、灵活的Web应用程序。 **...

    jsp+struct+hibernate+ibatis资源集锦珍藏

    在IT行业中,开发高效、可维护的Web应用是至关重要的,而`JSP`、`Struts`、`Hibernate`和`iBatis`这四个技术框架是Java Web开发领域中的核心工具。这个名为"jsp+struct+hibernate+ibatis资源集锦珍藏"的压缩包显然...

    ibatis和hibernate的区别

    【ibatis和Hibernate的区别】 在Java开发中,ibatis和Hibernate都是常见的对象关系映射(ORM)框架,它们简化了数据库操作,将Java对象与数据库表之间的映射关系抽象出来,使得开发人员可以使用面向对象的方式处理...

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...

    ibatis和hibernate的简单介绍

    ### ibatis和Hibernate的简单介绍 #### 一、ibatis简介 ibatis是Apache软件基金会的一个开源项目,它提供了一种轻量级的Java持久层框架。ibatis的核心功能是将SQL语句与Java代码分离,使开发人员可以更加专注于...

    hibernate和ibatis的区别

    主要描述的是hibernate和ibatis的区别,在什么时候使用hibernate比较好

Global site tag (gtag.js) - Google Analytics