hibernate
文章平均质量分 81
xiaoping8411
一个走在路上的人,前面有太多太多的路。一个为了学习与生活,要不停奔走的人。
展开
-
Hibernate学习44 -- 抓取策略4 -- 批量抓取(Batch fetching)
batch-size属性,可以批量加载实体类或集合,例如:,数字“3”表示每次合并几条sql。例子代码如下:Student.hbm.xmlhibernate-mapping package="hibernate"> class name="Classes" table="t_classes" batch-size="3"> id name="i原创 2009-12-10 12:26:00 · 820 阅读 · 0 评论 -
Hibernate学习30 -- Hibernate查询语言(HQL)4 -- 条件查询
条件查询:* 可以采用拼字符串的方式传递参数* 可以采用 ?来传递参数(索引从0开始)* 可以采用 :参数名 来传递参数* 如果传递多个参数,可以采用setParamterList方法* 在hql中可以使用数据库的函数,如:date_format例子代码如下:/** * 条件查询 */public class SimpleConditionQ原创 2009-12-08 13:10:00 · 1258 阅读 · 0 评论 -
Hibernate学习29 -- Hibernate查询语言(HQL)3 -- 实体对象查询
实体对象查询:² N + 1问题,在默认情况下,使用query.iterate查询,有可以能出现N+1问题,所谓的N+1是在查询的时候发出了N+1条sql语句:1:首先发出一条查询对象id列表的sqlN:根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句² list和iterate的区别?list每次都会发出原创 2009-12-08 13:07:00 · 526 阅读 · 0 评论 -
Hibernate学习28 -- Hibernate查询语言(HQL)2 -- 简单属性查询
简单属性查询:* 单一属性查询,返回结果集属性列表,元素类型和实体类中相应的属性类型一致* 多个属性查询,返回的集合元素是对象数组,数组元素的类型和对应的属性在实体类中的类型一致 数组的长度取决与select中属性的个数* 如果认为返回数组不够对象化,可以采用hql动态实例化Student对象。例子代码如下:/** * 简单属性查询 * @auth原创 2009-12-08 13:04:00 · 580 阅读 · 0 评论 -
Hibernate学习27 -- Hibernate查询语言(HQL)1 -- 准备
它是完全面向对象的查询语句,查询功能非常强大,具备继承、多态、关联等特性 。除了Java类与属性的名称外,查询语句对大小写并不敏感。下面我们将以班级与学生进行HQL示例,所以我们先建立Student.java、Classes.java以及映射文件,代码如下:Student.java:public class Student { private int i原创 2009-12-08 13:02:00 · 553 阅读 · 0 评论 -
Hibernate学习26 -- 延迟加载3 -- 关联lazy特征
hibernate在单端关联上的lazy策略,可以取值:false/proxy/noproxy。标签上的lazy不会影响到单端关联上的lazy特性。代码实现:SingleEndTest1.java/** * 所有lazy属性默认 */public class SingleEndTest1 extends TestCase { publi原创 2009-12-07 12:22:00 · 553 阅读 · 0 评论 -
Hibernate学习25 -- 延迟加载2 -- 集合Lazy特征
标签上的lazy不会影响到集合上的lazy特性,hibernate在集合上的lazy策略,可以取值:true/false/extra。代码实现:CellectionlazyTest1.java/** * 保持lazy默认,class标签lazy为true ,set标签lazy为true * */public class CellectionlazyTest1 e原创 2009-12-07 12:19:00 · 471 阅读 · 0 评论 -
Hibernate学习24 -- 延迟加载1 -- 类对象Lazy特征
hibernate支持lazy策略只有在session打开状态下有效。 hibernate lazy策略可以使用在: * 标签上,可以取值:true/false * 标签上,可以取值:true/false需要类增强工具 * 标签上,可以取值:true/false/extra * 单端关联上,可以取值:false/proxy/noproxy 1.1. 标签上lazy特性 lazy概念:原创 2009-12-07 12:18:00 · 481 阅读 · 0 评论 -
Hibernate学习15 -- 关联映射5 -- 多对多关联1 -- 多对多关联单向
一般的设计中,多对多关联映射,需要一个中间表,Hibernate会自动生成中间表,Hibernate使用many-to-many标签来表示多对多的关联。多对多的关联映射,在实体类中,跟一对多一样,也是用集合来表示的。步骤:n 建立POJO:User.java,Role.java,建立hibernate的配置文件,将两个hbm文件与其绑定n 在User原创 2009-12-03 17:57:00 · 657 阅读 · 0 评论 -
Hibernate学习32 -- Hibernate查询语言(HQL)6 -- 外置命名查询
外置命名查询:* 在映射文件中采用标签来定义hql* 在程序中采用session.getNamedQuery()方法得到hql查询串例子代码如下:映射文件:name属性值必须是唯一,可以放在任意映射文件, 建议放在一个专门放命名查询的映射文件 --> query name="searchStudents">原创 2009-12-08 13:16:00 · 792 阅读 · 0 评论 -
Hibernate学习33 -- Hibernate查询语言(HQL)7 -- 查询过滤器
查询过滤器: * 在映射文件中定义过滤器参数 * 在类的映射中使用这些参数 * 在程序中启用过滤器例子代码如下:映射文件:hibernate-mapping> class name=" hibernate.Student" table="t_student"> id name="id"> g原创 2009-12-08 13:18:00 · 650 阅读 · 0 评论 -
Hibernate学习34 -- Hibernate查询语言(HQL)8 -- 对象导航查询
对象导航查询,在hql中采用 . 进行导航。例子代码如下:/** * 对象导航查询 */public class ObjectNavQueryTest extends TestCase { public void testQuery1() { Session session = null; try {原创 2009-12-08 13:19:00 · 1951 阅读 · 0 评论 -
Hibernate学习42 -- 抓取策略2 -- 查询抓取
fetch="select",另外发送一条select语句抓取当前对象关联实体或集合。例如:例子代码如下:Student.hbm.xmlhibernate-mapping> class name="hibernate.Student" table="t_student"> id name="id"> gene原创 2009-12-10 12:23:00 · 573 阅读 · 0 评论 -
Hibernate学习41 -- 抓取策略1 -- 连接抓取
抓取策略(fetching strategy) 是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候, Hibernate如何获取关联对象的策略。抓取策略可以在O/R映射的元数据中声明,也可以在特定的HQL 或条件查询(Criteria Query)中重载声明。Hibernate定义几种抓取策略:u 连接抓取(Join fetching):Hib原创 2009-12-09 12:44:00 · 640 阅读 · 0 评论 -
Hibernate学习40 -- 缓存管理3 -- 查询缓存
查询缓存是针对普通属性结果集的缓存,对实体对象的结果集只缓存id。查询缓存的生命周期,当前关联的表发生修改,那么查询缓存生命周期结束。查询缓存的配置和使用:² 在hibernate.cfg.xml文件中启用查询缓存,添加以下代码:true² 在程序中必须手动启用查询缓存,如:query.setCacheable(true); 例子代码如下:原创 2009-12-09 12:29:00 · 664 阅读 · 0 评论 -
Hibernate学习39 -- 缓存管理2 -- 二级缓存
什么样的数据适合存放到第二级缓存中?l 很少被修改的数据 l 不是很重要的数据,允许出现偶尔并发的数据 l 不会被并发访问的数据 l 参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。 Hibernater 的二级缓存是一个插件,下面是几种常用原创 2009-12-09 12:25:00 · 663 阅读 · 0 评论 -
Hibernate学习38 -- 缓存管理1 -- 一级缓存
Hibernate 中提供了两级Cache,分别为:第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。 Hibernate还为查询结果提供了一个查询缓存,它依赖于原创 2009-12-09 12:17:00 · 659 阅读 · 0 评论 -
Hibernate学习37 -- Hibernate查询语言(HQL)11 -- DML风格的操作
DML风格的操作(尽量少用,因为和缓存不同步)例子代码如下:/** * DML风格的操作 */public class DMLQueryTest extends TestCase { public void testQuery1() { Session session = null; try {原创 2009-12-08 13:24:00 · 1378 阅读 · 3 评论 -
Hibernate学习36 -- Hibernate查询语言(HQL)10 -- 使用聚集函数查询
聚集函数查询:l count(*)l avg(...)l sum(...)l min(...)l max(...)l count(...)例子代码如下:/** * 统计查询 */public class StatQueryTest extend原创 2009-12-08 13:22:00 · 2086 阅读 · 0 评论 -
Hibernate学习35 -- Hibernate查询语言(HQL)9 -- 连接查询
连接查询: * 内连 * 外连接(左连接/右连接)例子代码如下:/** * 连接查询 */public class JoinQueryTest extends TestCase { public void testQuery1() { Session session = null; try {原创 2009-12-08 13:21:00 · 747 阅读 · 0 评论 -
Hibernate学习14 -- 关联映射4 -- 一对多关联
一对多关联映射利用了多对一关联映射原理多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多也就是说一对多和多对一的映射策略是一样的,只是站的角度不同。1.1.1.一对多关联单向l 步骤:n 建立POJO:Classes.java,Student原创 2009-12-03 17:41:00 · 537 阅读 · 0 评论 -
Hibernate学习20 -- 关联映射10 -- 组件映射(component)
在hibernate中,component是某个实体的逻辑组成部分,它与实体的根本区别是没有oid,component可以成为是值对象(DDD)。采用component映射的好处:它实现了对象模型的细粒度划分,层次会更分明,复用率会更高。例如:User对象有一系列联系方式,如电话号码,email,地址等,Admin对象也有一系列与User对象的联系方式。如果我们将联系方式抽取成一个类,那我们如原创 2009-12-04 12:40:00 · 547 阅读 · 0 评论 -
Hibernate学习19 -- 关联映射9 -- 继承映射3 -- 子类分别存储一张表
这种策略是使用union-subclass标签来定义子类的。每个子类对应一张表,而且这个表的信息是完备的,即包含了所有从父类继承下来的属性映射的字段(这就是它跟joined-subclass的不同之处,joined-subclass定义的子类的表,只包含子类特有属性映射的字段)。实现这种策略的时候,有如下步骤:1) 父类用普通标签定义即可2) 子类用标签原创 2009-12-04 12:37:00 · 753 阅读 · 0 评论 -
Hibernate学习17 -- 关联映射7 -- 继承映射1 -- 一张表存储
如果许多对象有相同的属性的类,我们可以把相同的属性抽取成一个父类,不同的对象都继承父类。例如:那我们应当如何映射和存储呢?我们根据不同的存储分为三种方法:n 一张表存储,即一张表存储pig和Birdn 父类存储在一张表,子类分别存储一张表,即Animal存一张表,Pig存一张表,Bird存一张表n 子类分别存储一张表,即需Pig存一张表,Bird存一张表1.1.1.一张表存原创 2009-12-04 12:12:00 · 1135 阅读 · 0 评论 -
Hibernate学习12 -- 关联映射2 -- 一对一关联1 -- 一对一主键关联
一对一关联表示两个对象之间是一对一的关系,如Person-IdCard。有两种策略可以实现一对一的关联映射:Ø 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联;Ø 唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系;一对一主键关联映射:让两个原创 2009-12-03 15:32:00 · 505 阅读 · 0 评论 -
Hibernate学习11 -- 关联映射1 -- 多对一关联
会在多的一端加入一个外键,指向一的一端,这个外键是由中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致。标签的定义示例:。步骤:n 建立POJO类:User.java和Group.java, 建立Hibernate配置文件,将两个hbm文件与其绑定。n 在User.java里面建立一个Group类型的属性n原创 2009-12-03 15:23:00 · 443 阅读 · 0 评论 -
Hibernate学习3 -- Session生命周期示例
1. Session生命周期示例持久化对象的状态:l 瞬时对象(Transient Objects):使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。l 持久化对象(Persist Objects):持久实例是任何具有数原创 2009-12-02 12:40:00 · 801 阅读 · 0 评论 -
Hibernate学习2 -- 第一个Hibernate程序
1. 第一个Hibernate项目1.1. 前期工作我们首先需要建立一个Java项目,加入如下jar: * HIBERNATE_HOME/hibernate3.jar * HIBERNATE_HOME/lib/*.jar * 数据库驱动复制hibernate.cfg.xml和log4j.properties到项目的src目录下,这两原创 2009-12-02 12:24:00 · 464 阅读 · 0 评论 -
Hibernate学习1 -- 概述
1. 介绍Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久原创 2009-12-02 12:23:00 · 565 阅读 · 0 评论 -
Hibernate学习21 -- 关联映射11 -- 复合主键映射(composite-id)
通常将复合主键相关的属性,单独放到一个类中 * 此类必须实现序列化接口 * 覆写hashcode和equals方法如果在表中有两个列合起来当主键怎么处理?强烈不建议使用这种方式。l 编写一个类(实现序列化接口),封装主键,并写属性。例如:public class CustomerPK implements Serializable{/原创 2009-12-04 12:43:00 · 756 阅读 · 0 评论 -
Hibernate学习16 -- 关联映射6 -- 多对多关联2 -- 多对多关联双向
l 题目:课程和老师是多对多关系:T_COURSE(CID,CNAME),T_TEACHER(TID,TNAME)。要求利用hibernate,实现:对课程的信息进行查询的时候,无需另外查询就可以得到老师的信息,对老师信息查询的时候也能知道他教了哪些课程l 首先建立第三个表:T_JIAOKE(TID,CID)l 步骤:n原创 2009-12-03 18:00:00 · 430 阅读 · 0 评论 -
Hibernate学习18 -- 关联映射8 -- 继承映射2 -- 父类存储在一张表,子类分别存储一张表
这种策略是使用joined-subclass标签来定义子类的。父类、子类,每个类都对应一张数据库表。在父类对应的数据库表中,实际上会存储所有的记录,包括父类和子类的记录;在子类对应的数据库表中,这个表只定义了子类中所特有的属性映射的字段。子类与父类,通过相同的主键值来关联。实现这种策略的时候。有如下步骤:1) 父类用普通的标签定义即可,父类不再需要定义discrimina原创 2009-12-04 12:35:00 · 1508 阅读 · 0 评论 -
Hibernate学习10 -- hibernate映射文件7 -- 一对一元素
持久化对象之间一对一的关联关系是通过one-to-one元素定义的。1) name: 属性的名字。2) class (可选 - 默认是通过反射得到的属性类型):被关联的类的名字。3) cascade(级联) (可选) 表明操作是否从父对象级联到被关联的对象。4) constrained(约束) (可选) 表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一原创 2009-12-03 12:28:00 · 578 阅读 · 0 评论 -
Hibernate学习9 -- hibernate映射文件6 -- 多对一元素
通过many-to-one元素,可以定义一种常见的与另一个持久化类的关联。 这种关系模型是多对一关联(实际上是一个对象引用-译注):这个表的一个外键引用目标表的 主键字段。1) name: 属性名。2) column (可选): 外间字段名。它也可以通过嵌套的 元素指定。3) class (可选 - 默认是通过反射得到属性类型): 关联的类的名字。4) cascade(级联)原创 2009-12-03 12:27:00 · 475 阅读 · 0 评论 -
Hibernate学习7 -- hibernate映射文件4 -- Generator元素
可选的子元素是一个Java类的名字, 用来为该持久化类的实例生成唯一的标识。如果这个生成器实例需要某些配置值或者初始化参数, 用元素来传递。例如: uid_tablenext_hi_value_column 所有的生成器都实现org.hibernate.id.IdentifierGenerator接口。 这是一个非常原创 2009-12-03 12:21:00 · 560 阅读 · 0 评论 -
Hibernate学习5 -- hibernate映射文件2 -- class元素
使用class元素来定义一个持久化类:1) name (可选): 持久化类(或者接口)的Java全限定名。 如果这个属性不存在,Hibernate将假定这是一个非POJO的实体映射。2) table (可选 - 默认是类的非全限定名): 对应的数据库表名。3) discriminator-value (可选 - 默认和类名一样): 一个用于区分不同的子类的值,在多态行为时使用。它可原创 2009-12-03 12:18:00 · 611 阅读 · 0 评论 -
Hibernate学习6 -- hibernate映射文件3 -- id元素
被映射的类必须定义对应数据库表主键字段。大多数类有一个JavaBeans风格的属性, 为每一个实例包含唯一的标识。 元素定义了该属性到数据库表主键字段的映射。(1) name (可选): 标识属性的名字。(2) type (可选): 标识Hibernate类型的名字。(3) column (可选 - 默认为属性名): 主键字段的名字。(4) unsaved-value (可选原创 2009-12-03 12:10:00 · 509 阅读 · 0 评论 -
Hibernate学习4 -- hibernate映射文件1 -- hibernate-mapping元素
hibernate映射文件包含一个hibernate-mapping元素,这个元素包括一些可选的属性,例如:(1) schema (可选): 数据库schema的名称。(2) catalog (可选): 数据库catalog的名称。(3) default-cascade (可选 - 默认为 none): 默认的级联风格。(4) default-access (可选 - 默认为原创 2009-12-03 12:08:00 · 751 阅读 · 0 评论 -
Hibernate学习23 -- 关联映射13 -- 动态模式映射
l 是否可以不定义JavaBean?l 解决方法:使用动态实体模型l 步骤:n 在class标签中设置一个属性:entity-name=”实体名称” 并指明对应的表名n 在每个property标签中,给定一个type属性,指定该列对应的类型名称n 代码如下:原创 2009-12-04 12:48:00 · 701 阅读 · 0 评论 -
Hibernate学习22 -- 关联映射12 -- 集合映射
在对象中有普通属性,也有可能有集合属性如set、list、array、map,那我们在hibernate中该如何映射呢?我们存储应当如下面显示:代码实现:1) 建立一个对象,里面包含普通属性也有集合属性,如list、set、array、map,例如:CollectionMapping.javapublic class CollectionMappi原创 2009-12-04 12:45:00 · 461 阅读 · 0 评论