




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Hibernate总结注:重点讲解关联映射 总结人 :张焕邮箱:欢迎交流讨论。目录1)核心接口简介2)Hibernate版本更新情况3)Hibernate关联映射 4) 简单属性查询5) Hibernate与延迟加载6)hibernate 中 Criteria 的使用介绍 7)Hibernate程序性能优化Hibernate优点: 1、封装了jdbc,简化了很多重复性代码。 2、简化了DAO层编码工作,使开发更对象化了。 3、移植性好,支持各种数据库,如果换个数据库只要在配置文件中变换配置就可以了,不用改变hibernate代码。 4、支持透明持久化,因为hibernate操作的是纯粹的(pojo)java类,没有实现任何接口,没有侵入性。所以说它是一个轻量级框架。Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。1)核心接口简介:Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。这6个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这6个核心接口分别加以介绍。Session接口Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。 SessionFactory接口SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。 Configuration类Configuration类负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。Transaction接口Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。Query和Criteria接口Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语句或SQL语句两种表达方式。2)Hibernate版本更新情况Hibernate版本更新速度很快,目前为止有两个阶段性的版本:Hibernate2,Hibernate3和Hibernate4,这一点程序员从其Jar文件名便可以看出来。目前最新发布的版本是hibernate-core-4.1.6.Final。 Hibernate2系列的最高版本是Hibernate2.1.8,Hibernate3系列的最高版本是hibernate-distribution-3.6.10.Final-dist版,但目前使用较多且较稳定的版本是Hibernate 3.1.3或Hibernate 3.1.2。 另外,自Hibernate3发布以来,其产品线愈加成熟,相继出现了Hibernate注释、Hibernate实体管理器、Hibernate插件工具等一系列产品套件。在方便程序员使用Hibernate进行应用程序的开发的同时,也逐渐增强了Hibernate产品线的实力。 但目前市面上用于学习Hibernate开发的图书并不多见,大多是介绍老版的Hibernate2,最近希赛和博文联手推出的贯通Hibernate开发,对最新的Hibernate3作了详尽的解答,推荐读者阅读。3)Hibernate关联映射 以简单的两个类为例: User(int id, String name) Group(int id, String name)没有关联关系时的关系模型: t_user(id int pk, name varchar) t_group(id int pk, name varchar)一、多对一和一对多关联映射(多个用户有相同的组)这几种关联映射后的关系模型是相同的: t_user(id int pk, name varchar, gid int fk-t_group(id) t_group(id int pk, name varchar) 1、多对一单向关联实体模型: bean.User(int id, String name, Group group) bean.Group(int id, String name) !- 使用映射多对一关系。导出ddl时将自动生成一个外键 - 2、一对多单向关联(几乎不用)实体模型: bean.User(int id, String name) bean.Group(int id, String name, Set users) !- 使用映射集合 - !- 使用指定引用至自身的外键表(t_user)中的外键 - !- 使用映射一对多关系 - 为Group加入集合也可以使用List(),注意不能指定类型是具体的HashSet或ArrayList,只能是接口Set或List。 集合标签可以使用order-by属性指定排序:3、双向关联实体模型: bean.User(int id, String name, Group group) bean.Group(int id, String name, Set users) !- 使用映射多对一关系。导出ddl时将自动生成一个外键 - !- 使用映射集合 - !- 使用指定引用至自身的外键表(t_user)中的外键 - !- 使用映射一对多关系 - 双向关联中,为加入”inverse=true”可以反转维护关系:Hibernate将放弃从一的一端维护。意思就是user和group的关系必须使用user维护,操作group时Hibernate将不维护这个关系。?1操作group的示例:session.beginTransaction();User user = new User();user.setName(张三); Group group = new Group();group.setName(admin);group.setUsers(new HashSet();group.getUsers().add(user); session.save(user);session.save(group);session.getTransaction().commit();没有配置inverse=”true”时,Hibernate输出了添加user和group,并更新user的语句:Hibernate: insert into t_user (name, gid) values (?, ?)Hibernate: insert into t_group (name) values (?)Hibernate: update t_user set gid=? where id=?而配置了inverse=”true”后,Hibernate仅仅输出了添加user和group的语句,并没有更新user,放弃了关系的维护:Hibernate: insert into t_user (name, gid) values (?, ?)Hibernate: insert into t_group (name) values (?)此时应该从user端维护关系:session.beginTransaction();Group group = new Group();group.setName(admin); User user = new User();user.setName(张三);user.setGroup(group); session.save(group);session.save(user);session.getTransaction().commit();因为外键列在t_user表中,从group端维护需要操作多表,所以从user端维护关系更加合理,效率也更高。上面的代码输出两条SQL语句,插入数据的同时也维护了关系:Hibernate: insert into t_group (name) values (?)Hibernate: insert into t_user (name, gid) values (?, ?) 二、一对一关联映射(每个用户独有一个组)依照映射方法不同,可分为主键关联映射和唯一外键关联映射。主键关联是维护两张表的主键一致,如有必要还可以在主键上再加上外键约束;唯一外键关联则类似于多对一关联,为表加入一个外键列,不过一对一关联会同时将这个外键加上唯一约束。1、主键关联映射主键关联生成的关系模型: t_user(id int pk fk-t_group(id), name varchar) t_group(id int pk, name varchar)1.1、主键单向关联实体模型: bean.User(int id, String name, Group group) bean.Group(int id, String name) group !- 使用映射一对一关系。 - 主键关联由Hibernate维护,不依赖数据库。如果需要在数据库端也生成外键约束,可以使用constrained:?11.2、主键双向关联实体模型: bean.User(int id, String name, Group group) bean.Group(int id, String name, User user) group !- 使用映射一对一关系。 - !- 使用映射一对一关系 - 2、唯一外键关联映射唯一外键关联生成的关系模型: t_user(id int pk, name varchar, gid int fk-t_group(id) t_group(id int pk, name varchar)2.1、唯一外键单向关联实体模型: bean.User(int id, String name, Group group) bean.Group(int id, String name) !- 为加上unique就变成了一对一 - 2.2、唯一外键双向关联实体模型: bean.User(int id, String name, Group group) bean.Group(int id, String name, User user) !- 为加上unique就变成了一对一 - !- 使用映射一对一 - 三、多对多关联映射(每个用户拥有多个组,每个组也有多个用户)多对多关联映射关系使用中间表表示。导出关系模型时Hibernate将自动生成复合主键以及外键约束。关系模型: t_user(id int pk, name varchar) t_group(id int pk, name varchar) t_user_group(userid int fk-t_user(id), groupid int fk-t_group(id), pk(userid, groupid)1、多对多单向关联实体模型: bean.User(int id, String name, Set groups) bean.Group(int id, String name) !- 使用映射集合,在多对多关系中,Hibernate将生成第三张表 - !- 使用指定引用至自身的外键表(t_user_group)中的外键 - !- 使用映射多对多关系,column指定另一端在表t_user_group中的列 - 1、多对多单向关联实体模型: bean.User(int id, String name, Set groups) bean.Group(int id, String name, Set users) !- 使用映射集合,在多对多关系中,Hibernate将生成第三张表 - !- 使用指定引用至自身的外键表(t_user_group)中的外键 - !- 使用映射多对多关系,column指定另一端在表t_user_group中的列 - !- 使用映射集合,在多对多关系中,Hibernate将生成第三张表 - !- 使用指定引用至自身的外键表(t_user_group)中的外键 - !- 使用映射多对多关系,column指定另一端在表t_user_group中的列 - 多对多的双向关联同样可以在不想要维护关系的一端的里设置inverse=”true”;但是必须有一端可以维护,也就是说只可以设置一个。Technorati 标签: Java,Hibernate,学习笔记,映射,关联映射,Mapping4). 简单属性查询(增删改省略) 单一属性查询,返回属性结果集列表,元素类型和实体类的相应的类型一致。 java view plaincopy 1. List students = session.createQuery(select name from Student).list(); 2. 3. for (Iterator iter=students.iterator(); iter.hasNext();) 4. 5. String name = (String)iter.next(); 6. 7. System.out.println(name); 8. 9. /返回结果集属性列表,元素类型和实体类中的属性类型一致 多个属性查询,多个属性查询返回数组对象,对象数组的长度取决于属性的个数,对象数组中的元素类型与实体类中属性一致。 java view plaincopy 1. List students = session.createQuery(select id, name from Student).list(); 2. 3. for (Iterator iter=students.iterator(); iter.hasNext();) 4. 5. Object obj = (Object)iter.next(); 6. 7. System.out.println(obj0 + , + obj1); 8. 9. 5)Hibernate与延迟加载hibernate延迟加载: get不支持延迟加载,load支持延迟加载。 1、hibernate2对 实体对象和集合 实现了延迟加载 2、hibernate3对 提供了属性的延迟加载功能 hibernate延迟加载就是当使用session.load(User.class,1)或者session.createQuery()查询对象或者属性的时候 这个对象或者属性并没有在内存中,只有当程序操作数据的时候,才会存在内存中,这样就实现延迟加载,节省了内存的开销,从而提高了服务器的性能。Hibernate对象关系映射提供延迟的与非延迟的对象初始化。非延迟加载在读取一个对象的时候会将与这个对象所有相关的其他对象一起读取出来。这有时会导致成百的(如果不是成千的话)select语句在读取对象的时候执行。这个问题有时出现在使用双向关系的时候,经常会导致整个数据库都在初始化的阶段被读出来了。当然,你可以不厌其烦地检查每一个对象与其他对象的关系,并把那些最昂贵的删除,但是到最后,我们可能会因此失去了本想在ORM工具中获得的便利。 一个明显的解决方法是使用Hibernate提供的延迟加载机制。这种初始化策略只在一个对象调用它的一对多或多对多关系时才将关系对象读取出来。这个过程对开发者来说是透明的,而且只进行了很少的数据库操作请求,因此会得到比较明显的性能提升。这项技术的一个缺陷是延迟加载技术要求一个Hibernate会话要在对象使用的时候一直开着。这会成为通过使用DAO模式将持久层抽象出来时的一个主要问题。为了将持久化机制完全地抽象出来,所有的数据库逻辑,包括打开或关闭会话,都不能在应用层出现。最常见的是,一些实现了简单接口的DAO实现类将数据库逻辑完全封装起来了。一种快速但是笨拙的解决方法是放弃DAO模式,将数据库连接逻辑加到应用层中来。这可能对一些小的应用程序有效,但是在大的系统中,这是一个严重的设计缺陷,妨碍了系统的可扩展性。6)hibernate 中 Criteria 的使用介绍 要对资料库管理系统进行操作,最基本的就是使用SQL(Standard Query Language)语句,大部份的资料库都支援标准的SQL语句,然而也有一些特定于资料库的SQL语句,应用程式配合SQL语句进行资料库查询时,若使用到特定于资料库的SQL语句,程式本身会有相依于特定资料库的问题。 使用Hibernate时,即使您不了解SQL的使用与撰写,也可以使用它所提供的API来进行SQL语句查询,org.hibernate.Criteria对SQL进行封装,您可以从Java物件的观点来组合各种查询条件,由Hibernate自动为您产生SQL语句,而不用特别管理SQL与资料库相依的问题。 以最基本的查询来说,如果您想要查询某个物件所对应的资料表中所有的内容,您可以如下进行查询: Criteria criteria = session.createCriteria(User.class); List users = criteria.list(); for(Iterator it = users.iterator(); it.hasNext(); ) User user = (User) it.next(); System.out.println(user.getId() + t + user.getName() + / + user.getAge(); Criteria建立后,若不给予任何的条件,预设是查询物件所对应表格之所有资料,如果您执行以上的程式片段,并于设定档中设定了了Hibernate的”show_sql”属性,则可以在主控下看到以下的SQL语句之产生: Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ Criteria基本查询条件设定 org.hibernate.Criteria实际上是个条件附加的容器,如果想要设定查询条件,则要使用org.hibernate.criterion.Restrictions的各种静态方法传回org.hibernate.criterion.Criteria实例,传回的每个org.hibernate.criterion.Criteria实例代表着一个条件,您要使用org.hibernate.Criteria的add()方法加入这些条件实例,例如查询”age”大于20且小于40的资料: Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.gt(age, new Integer(20); criteria.add(Restrictions.lt(age, new Integer(40); List users = criteria.list(); for(Iterator it = users.iterator(); it.hasNext(); ) User user = (User) it.next(); System.out.println(user.getId() + t + user.getName() + / + user.getAge(); Restrictions的gt()方法表示大于(great than)的条件,而lt表示小于(less than)的条件,执行以上程式片段,观察所产生的SQL语句,将使用where与and子句产来完成SQL的条件查询: Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.age? and this_.age 使用add()方法加入条件时,预设是使用and来组合条件,如果要用or的方式来组合条件,则可以使用Restrictions.or()方法,例如结合age等于(eq)20或(or)age为空(isNull)的条件: Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.or( Restrictions.eq(age, new Integer(20), Restrictions.isNull(age) ); List users = criteria.list(); 观察所产生的SQL语句,将使用where与or子句完成SQL的条件查询: Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where (this_.age=? or this_.age is null) 您也可以使用Restrictions.like()方法来进行SQL中like子句的功能,例如查询”name”中名称为”just”开头的资料: Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.like(name, just%); List users = criteria.list(); 观察所产生的SQL语句如下: Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.name like ? Restrictions的几个常用限定查询方法如下表所示: 方法 说明 Restrictions.eq 等于 Restrictions.allEq 使用Map,使用key/value进行多个等于的比对 Restrictions.gt 大于 Restrictions.ge 大于等于 = Restrictions.lt 小于 Restrictions.le 小于等于 = Restrictions.between 对应SQL的BETWEEN子句 Restrictions.like 对应SQL的LIKE子句 Restrictions.in 对应SQL的in子句 Restrictions.and and关係 Restrictions.or or关係 Criteria进阶查询条件设定 使用Criteria进行查询时,不仅仅能组合出SQL中where子句的功能,还可以组合出如排序、统计、分组等的查询功能。 排序 您可以使用Criteria进行查询,并使用org.hibernate.criterion.Order对结果进行排序,例如使用Oder.asc(),指定根据”age”由小到大排序(反之则使用desc()): Criteria criteria = session.createCriteria(User.class); criteria.addOrder(Order.asc(age); List users = criteria.list(); 注意在加入Order条件时,使用的是addOrder()方法,而不是add()方法,在产生SQL语句时,会使用order by与asc(desc)来进行排序指定: Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ order by this_.age asc 限定查询笔数 Criteria的setMaxResults()方法可以限定查询回来的笔数,如果配合setFirstResult()设定传回查询结果第一笔资料的位置,就可以实现简单的分页,例如传回第51笔之后的50笔资料(如果有的话): Criteria criteria = session.createCriteria(User.class); criteria.setFirstResult(51); criteria.setMaxResults(50); List users = criteria.list(); 根据您所指定得资料库,Hibernate将自动产生与资料库相依的限定笔数查询子句,例如在MySQL中,将使用limit产生以下的SQL语句: Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ limit ?, ? 统计动作 您可以对查询结果进行统计动作,使用org.hibernate.criterion.Projections的avg()、rowCount()、count()、max()、min()、 countDistinct()等方法,再搭配Criteria的setProjection()方法加入条件设定,例如对查询结果的age作平均: Criteria criteria = session.createCriteria(User.class); criteria.setProjection(Projections.avg(age); List users = criteria.list(); 上面的程式将由Hibernate自动产生SQL的avg函数进行平均计算: Hibernate: select avg(this_.age) as y0_ from T_USER this_ 分组 还可以配合Projections的groupProperty()来对结果进行分组,例如以age进行分组,也就是如果资料中age如果有 20、20、25、30,则
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电子支付恢复服务方案
- 2025年心理咨询师基础理论知识测试卷:心理咨询师心理治疗技术考核实战考核实战试题
- 基于Gd基增敏材料的双模成像引导肿瘤微波热化疗体系构建与效能研究
- 2025年健身教练职业技能考核试卷:健身俱乐部运营管理试题解析
- 基于FtsZ靶点的5-甲基菲啶类衍生物的抗菌探索与机制解析
- 2025年大学国内安全保卫专业题库- 国内安全保卫专业实习报告撰写规范化
- 2025年初中地理实验探究模拟试卷及答案掌握地理实验探究核心知识
- 成都心血管治疗器械股份有限公司2024下半年绩效报告
- 基于EVA的新三板教育企业价值评估:以华图教育为镜鉴
- 基于ERP实验的汉语转喻规约性多维度解析与认知探究
- 产品物料编码管理制度
- 2025年急性肺栓塞诊断和治疗指南解读课件
- 无痛分娩试题及答案
- 帮忙找工作协议书
- 转让账户协议书
- 锯床操作规程
- 服刑人员出监适应性教育
- 一故事一音标课件
- 2025年煤矿安全规程试题及答案
- 六年级数学口算与解决问题
- 住宅厨房卫生间排烟气系统建筑构造L18J905
评论
0/150
提交评论