hibernate学习笔记_第1页
hibernate学习笔记_第2页
hibernate学习笔记_第3页
hibernate学习笔记_第4页
hibernate学习笔记_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1、#第一个 hibernate 项目1、新建 java 项目2、创建 User Library, 加入如下 jar* HIBERNATE_HOME/hibernate3.jar* HIBERNATE_HOME/lib/*.jar* MySql jdbc 驱动3、创建 hibernate 配置文件 hibernate.cfg.xml ,为了便于调试最好加入 log4j 配置文件4、定义实体类5、定义 User 类的映射文件 User.hbm.xml6、将 User.hbml.xml 文件加入到 hibernate.cfg.xml 文件中7、编写 hbm2ddl 工具类,将实体类生成数据库表8、

2、开发客户端为 了 方 便 跟 踪 sql 执 行 , 在 hibernate.cfg.xml 文 件 中 加 入 true 2、#测试实体对象的生命周期junit 简介:* 编写测试类 xxxTest ,需要继承 TestCase* 编写单元测试方法, 测试方法必须以 test 开头,测试方法不能含有参数和返回值, 如: public void testHello1() * 最好单元测试的代码单独建立一个目录了解 Hibernate 中 CRUD 操作 了解 get 和 load 的区别?* get 不支持 lazy, load 支持 lazy* 采用 get 加载数据,如果没有匹配的数据,返

3、回 null ,而 load 则抛出异常 transient 状态的特征?* 在数据库中没有与之匹配的数据* 没有纳入 session 的管理persistent 状态的特征?* persistent 状态的对象在数据库中有与之匹配的数据* 纳入了 session 的管理* 在清理缓存(脏数据检查)的时候 ,会和数据库同步detached 状态的特征?* 在数据库中有与之匹配的数据* 没有纳入 session 的管理3、hibernate 基本映射 实体类 -表 实体类中的普通属性 -表字段采用标签映射成数据库表,通过标签将普通属性映射成表字段所谓普通属性指不包括自定义类、集合和数组等注意:如

4、果实体类和实体类中的属性和 sql 中的关键字重复,必须采用 table 或 column 重新 命名实体类的设计原则:* 实现一个默认的(即无参数的)构造方法(constructor)* 提供一个标识属性( identifier property )(可选)* 使用非 final 的类 (可选 )* 为持久化字段声明访问器 (accessors)主键生成策略:uuid、 native 和 assignedsessionfactory 接口4、hibernate 多对一关联映射关联映射的本质:* 将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用 会在多的一端加入一个外键

5、,指向一的一端,这个外键是由 中的 column 属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致 标签的定义示例:* 理解级联的含义? * 是对象的连锁操作: cascade5、hibernate 一对一主键关联映射 (单向关联 PersonIdCard )一对一主键关联映射 :让两个实体对象的 id 保持相同,这样可以避免多余的字段被创建 具体映射:idCard6、ibernate 一对一主键关联映射(双向关联PersonIdCard )需要在idcard映射文件中加入 标签指向person,指示 hibernate如何加载 person 默认根据主键加载7、 hibernat

6、e 一对一唯一外键关联映射(单向关联Person IdCard )一对唯一外键关联映射是多对一关联映射的特例可以采用标签,指定多的一端的unique=true,这样就限制了多的一端的多重性为一通过这种手段映射一对一唯一外键关联8、 hibernate 一对一唯一外键关联映射(双向关联PersonIdCard )一对一唯一外键关联双向,需要在另一端(idcard),添加标签,指示 hibernate如何加载其关联对象,默认根据主键加载perso n,外键关联映射中,因为两个实体采用的是person的外键维护的关系,所以不能指定主键加载person,而要根据person的外键加载,所以采用如下映射

7、方式:9、hibernate 多对多关联映射 (单向 UserRole)具体映射方式:10、hibernate 多对多关联映射 (双向 UserRole)映射方法:table属性值必须和单向关联中的table属性值一致中column属性值要与单向关联中的 标签中的 column属性值一致 在中的column属性值要与单向关联中 标签的column属性值一致11、hibernate 多对一关联映射 关联映射的本质:* 将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用 会在多的一端加入一个外键,指向一的一端,这个外键是由 中的 column 属性定义的,如果忽略了这个属性那

8、么默认的外键与实体的属性一致 标签的定义示例:* 理解级联的含义?* 是对象的连锁操作12、session flush 测试:session flush 方法主要做了两件事:* 清理缓存* 执行 sqlsession 在什么情况下执行 flush* 默认在事务提交时* 显示的调用 flush* 在执行查询前,如: iterate13、lazyhibernate lazy 策略可以使用在:* 标签上,可以取值: true/false* 标签上,可以取值: true/false 需要类增强工具* 标签上,可以取值: true/false/extra* 单端关联上,可以取值: false/proxy

9、/noproxylazy 概念:只有真正使用该对象时,才会创建,对于 hibernate 而言,正真使用的时候才会发出 sqlhibernate 支持 lazy 策略只有在 session 打开状态下有效标签上的lazy特性只对普通属性起作用hibernate 在集合上的 lazy 策略,可以取值: true/false/extra标签上的lazy不会影响到集合上的lazy特性hibernate 在单端关联上的 lazy 策略,可以取值: false/proxy/noproxy标签上的lazy不会影响到单端关联上的lazy特性14、每棵继承树映射成一张表(1)、理解如何映射因为类继承树肯定是对

10、应多个类, 要把多个类的信息存放在一张表中, 必须有某种 机制来区分哪些记录是属于哪个类的。hibernate 实现这种机制就是,在表中添加一个字段,用这个字段的值来进行区分。用 这种策略的时候,有如下步骤:父类用普通的class标签定义 在父类中定义一个 discriminator ,即指定这个区分的字段的名称和类型 如: discriminator column= ”XXX ” type= ” string ”/子类使用subclass标签定义,在定义 subclass的时候,需要注意如下几点: Subclass标签的name属性是子类的全路径名在 Subclass 标签中,用 discr

11、iminator-value 属性来标明本子类的 discriminator 字段(用 来区分不同类的字段)的值Subclass标签,既可以被 class标签所包含(这种包含关系正是表明了类之间的继 承关系),也可以与class标签平行。 当subclass标签的定义与class标签平行的时候,需要在subclass标签中,添加extends属性,里面的值是父类的全路径名称。子类的其它属性,像普通类一样,定义在subclass标签的内部。(2)、理解如何存储 存储的时候 hibernate 会自动将鉴别字段值插入到数据库中,在加载数据的时候, hibernate 能根据这个鉴别值正确的加载对象

12、多态查询:在 hibernate 加载数据的时候能鉴别出正真的类型( instanceOf)get 支持多态查询load 只有在 lazy=false ,才支持多态查询 hql 支持多态查询15、每个子类映射成一张表(1)、理解如何映射 这种策略是使用 joined-subclass 标签来定义子类的。父类、子类,每个类都对应一 张数据库表。在父类对应的数据库表中, 实际上会存储所有的记录, 包括父类和子类的记录; 在子类 对应的数据库表中,这个表只定义了子类中所特有的属性映射的字段。 子类与父类, 通过相同的主键值来关 联。实现这种策略的时候,有如下步骤: 父类用普通的class标签定义即可

13、 父类不再需要定义 discriminator 字段子类用joined-subclass标签定义,在定义 joined-subclass的时候,需要注意如下几点: Joined-subclass标签的name属性是子类的全路径名Joined-subclass标签需要包含一个 key标签,这个标签指定了子类和父类之间是通过哪 个字段来关联的。女口: key column= ” PARENT_KEY_ID ” /,这里的column ,实际上就是父类的主键对 应的映射字段名称。Joined-subclass标签,既可以被class标签所包含(这种包含关系正是表明了类之间的继 承关系),也可以与cl

14、ass标签平行。当Joined-subclass标签的定义与 class标签平行的时候,需要在 Joined-subclass标签中,添加exte nds属性,里面的值是父类的全路径名称。子类的其它属性,像普通 类一样,定义在 joined-subclass 标签的内部。16、每个具体类映射成一张表(1)、理解如何映射这种策略是使用 union-subclass 标签来定义子类的。每个子类对应一张表,而且这个表 的信息是完备的,即包含了所有从父类继承下来的属性映射的字段(这就是它跟joined-subclass 的不同之处,joined-subclass 定义的子类的表, 只包含子类特有属性映

15、射的字段) 。实现这种策略的时 候,有如下步骤:父类用普通标签定义即可子类用 标签定义,在定义 union-subclass 的时候,需要注意如下几点: Union-subclass 标签不再需要包含 key 标签(与 joined-subclass 不同)Union-subclass 标签, 既可以被 class 标签所包含 (这种包含关系正是表明了类之间的继 承关系),也可以与class标签平行。当Union-subclass标签的定义与 class标签平行的时候,需要在 Union-subclass标签中,添加exte nds属性,里面的值是父类的全路径名称。子类的其它属性,像普通 类一

16、样,定义在 Union-subclass 标签的内部。这个时候,虽然在 union-subclass 里面定义的只有 子类的属性,但是因为它继承了父类, 所以, 不需要定义其它的属性, 在映射到数据库表的时候,依 然包含了父类的所有属性的映射字段。注意:在保存对象的时候 id 是不能重复的(不能使用自增生成主键)17、component 映射在hibernate中,component是某个实体的逻辑组成部分,它与实体的根本区别是没有oid,component 可以成为是值对象( DDD )采用 component 映射的好处: 它实现了对象模型的细粒度划分, 层次会更分明, 复用率会更 高复合

17、(联合)主键映射 通常将复合主键相关的属性,单独放到一个类中* 此类必须实现序列化接口* 覆写 hashcode 和 equals 方法18、悲观锁 乐观锁悲观锁的实现, 通常依赖于数据库机制, 在整个过程中将数据锁定, 其它任何用户都不能读 取或修改 .大多数基于数据版本记录机制(version )实现,一般是在数据库表中加入一个version 字段读取数据时将版本号一同读出, 之后更新数据时版本号加一, 如果提交数据时版本号小于或 等于数据表中的版本号,则认为数据是过期的,否则给予更新。19、hibernate 查询语言 hql在 hql 中关键字不区分大小写,但是属性和类名区分大小写、简

18、单属性查询【重要】* 单一属性查询,返回结果集属性列表,元素类型和实体类中相应的属性类型一致* 多个属性查询 ,返回的集合元素是对象数组, 数组元素的类型和对应的属性在实体类中的类型一致数组的长度取决与 select 中属性的个数* 如果认为返回数组不够对象化,可以采用 hql 动态实例化 Student 对象 参见: SimplePropertyQueryTest.java、实体对象查询【重要】* N + 1问题,在默认情况下,使用 query.iterate查询,有可以能出现N+1问题所谓的N+1是在查询的时候发出了N+1条sql语句1: 首先发出一条查询对象 id 列表的 sqlN: 根

19、据 id 列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的 sql 语句* list 和 iterate 的区别?* list 每次都会发出 sql 语句, list 会向缓存中放入数据,而不利用缓存中的数据* iterate:在默认情况下iterate利用缓存数据,但如果缓存中不存在数据有可以能 出现 N+1 问题参见: SimpleObjectQueryTest1.java/SimpleObjectQueryTest2.java、条件查询【重要】* 可以采用拼字符串的方式传递参数* 可以采用 ?来传递参数(索引从 0 开始)* 可以采用 :参数名 来传递参数*如果

20、传递多个参数,可以采用 setParamterList方法* 在 hql 中可以使用数据库的函数,如:date_format参见: SimpleConditionQueryTest.java、 hibernate 也支持直接使用 sql 进行查询 参见: SqlQueryTest.java、外置命名查询* 在映射文件中采用 标签来定义 hql* 在程序中采用 session.getNamedQuery() 方法得到 hql 查询串 参见: Student.hbm.xml 、 NameQueryTest.java、查询过滤器* 在映射文件中定义过滤器参数* 在类的映射中使用这些参数* 在程序中启

21、用过滤器 参见: Student.hbm.xml 、 FilterQueryTest.java、分页查询【重要】* setFirstResult() ,从 0 开始* setMaxResults, 每页显示多少条数据 参见: PageQueryTest.java 、对象导航查询,在 hql 中采用 . 进行导航【重要】 参见: ObjectNavQueryTest.java、连接查询【重要】* 内连* 外连接(左连接 / 右连接) 参见: JoinQueryTest.java、统计查询【重要】 参见: StatQueryTest.java、 DML 风格的操作(尽量少用,因为和缓存不同步) 参

22、见: DMLQueryTest.java20、hibernate 一级缓存一级缓存很短和 session 的生命周期一致,一级缓存也叫session 级的缓存或事务级缓存那些方法支持一级缓存:* get()* load()* iterate (查询实体对象)如何管理一级缓存:session.clear(),session.evict()如何避免一次性大量的实体数据入库导致内存溢出* 先 flush ,再 clear如果数据量特别大,考虑采用 jdbc 实现,如果 jdbc 也不能满足要求可以考虑采用数据本身 的特定导入工具21、hibernate 二级缓存二级缓存也称进程级的缓存或Sessio

23、nFactory级的缓存,二级缓存可以被所有的session共享二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存二级缓存的配置和使用:* 将 echcache.xml 文件拷贝到 src 下* 开启二级缓存,修改 hibernate.cfg.xml 文件true* 指定缓存产品提供商,修改 hibernate.cfg.xml 文件org.hibernate.cache.EhCacheProvider* 指定那些实体类使用二级缓存(两种方法)*在映射文件中采用标签* 在 hibernate.cfg.xml 文件中,采用 标签二级缓存是缓存实体对象的了解一级缓存和二级缓存的交互22、hibernate 查询缓存查询缓存是针对普通属性结果集的缓存对实体对象的结果集只缓存

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论