资源预览内容
第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
亲,该文档总共7页全部预览完了,如果喜欢就下载吧!
资源描述
Hibernate 笔记Hibernate 概念:是一个面向 JAVA 环境得对象/ 关系数据库映射工具。主要体现:1. 是开源的持久层框架2. ORM 映射工具,建立面向对象的域模型和关系数据模型之间得映射3. 是连接 JAVA 工程和数据库得中间件4. 对 JDBC 得封装,负责对 JAVA 对象得持久化5. 在分层结构中处于持久化层,封装了数据库的访问细节,使业务逻辑层更专注实现业务逻辑作用:1. Hibernate 对 JDBC 访问数据库代码进行了封装,大大减少了访问数据库层繁琐得重复代码2. Hibernate 是一个基于 JDBC 得主流持久化框架,是一个优秀得 ORM 实现,很大程度的减少了 DAO 层得编码工作3. Hibernate 使用 JAVA 得反射机制,而不是字节码增强程序类实现得透明性4. Hibernate 的性能非常好,因为它是一个轻量级框架,映射得灵活性很出色。它支持很多关系型数据库,从一对一到多对多复杂的关系持久化封装了数据访问的细节,为业务逻辑层提供了面向对象的 API。完善的持久化层应该达到的目标:1. 代码重用性高,可完成所有的数据访问操作2. 如果需要的话,能够支持多种数据库平台。3. 具有相对独立性,当持久化层变化时,不会影响上层实现。持久化的概念:实体域对象在内存中创建后,不能永久存在。将实体域对象永久保存起来,就是持久化的过程ORM实现思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作作用:ORM 的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作,充当业务逻辑层和数据库层之间的桥梁运行原理:1. 运用反射机制,获得 Customer 对象的 Customer.class 类2. 参照映射文件得到 Customer 类对应的表的信息,以及和 Customer 类关联的类以及 相应的表信息3. 根据以上信息生成 SQL 语句4. 调用 hibernate API,执行该语句关联关系1. 单向关联:仅仅建立了 A 类和 B 类得关联,但是 B 类却没有建立到 A 类得关联关系2. 双向关联:即建立 A 类到 B 类得关联关系,又建立了 B 类到 A 类得关联关系 多对一在 Hibernate 中使用 来映射多对一关联关系* name:设定待映射的持久化类的名字。* column:设定和持久化类的属性对应的表的外键。* class:设定持久化类的属性的类型。* not-null:是否允许为空。 一对多在 Hibernate 中使用 来映射一对多双向关联关系* name:设定待映射持久化类的属性名。* cascade:设定级联操作的程度。* key:子属性:设定与所关联的持久化类对应的表的外键。* column: 指定关联表的外键名* one-to-many:子属性:设定所关联的持久化类(集合中存放的对象 )。* class:指定关联的持久化类的类名注意:Hibernate 会自动清理缓存中的所有持久化对象,按照持久化对象的改变来同步更新数据库,因此执行了上述的两条更新语句所以会产生两条 update 语句在一对多双向关联时,有一个 inverse 属性,该属性表示由双方哪一方来维持数据库的关系,通常情况下,都是由多的一方维持。在映射一对多的双向关联关系时,应该在 one 方把 inverse 属性设为 true,这可以提高性能。级联删除:如果 cascade 属性取默认值 none,不会自动删除和 customer 关联的其他持久化对象。如果希望删除 customer 时,自动删除和 customer 关联的 order 对象,可把 cascade 属性设为 delete 多对多多对多的实体关系模型也是很常见的,比如学生和课程的关系。一个学生可以选修多门课程,一个课程可以被多名学生选修。在关系型数据库中对于多对多关联关系的处理一般采用中间表的形式,将多对多的关系转化成两个一对多的关系* 双向 n-n 关联需要两端都使用集合属性* 双向 n-n 关联必须使用中间表* 集合属性应增加 key 子元素用以映射外键列, 集合元素里还应增加 many-to-many 子元素关联实体类* 在双向 n-n 关联的两边都需指定连接表的表名及外键列的列名. 两个集合元素 set 的 table 元素的值必须指定,而且必须相同注意:对于双向 n-n 关联, 须把其中一端的 inverse 设置为 true, 否则可能会造成主键冲突 一对一一对一关联指两个表之间的记录是一一对应的关系。分为两种:外键关联和主键关联* 对于基于外键的 1-1 关联,其外键可以存放在任意一边,在需要存放外键一端,增加 many-to-one 元素。为 many-to-one 元素增加 unique=“true” 属性来表示为 1-1 关联,并用 name 属性来指定关联属性的属性名* 另一端需要使用 one-to-one 元素,该元素使用 property-ref(可以不加) 属性指定使用被关联实体主键以外的字段作为关联字段一对一的另一种解决方式就是主键关联,在这种关联关系中,要求两个对象的主键必须保持一致,通过两个表的主键建立关联关系,无须外键参与* 基于主键的映射策略: 指一端的主键生成器使用 foreign 策略,表明根据”对方”的主键来生成自己的主键,自己并不能独立生成主键. 子元素指定使用当前持久化类的哪个属性作为 “对方”* 采用 foreign 主键生成器策略的一端增加 one-to-one 元素映射关联属性,其 one-to-one 属性还应增加 constrained=“true” 属性;另一端(company)增加 one-to-one 元素映射关联属性* constrained(约束):指定为当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联的对象( “对方 ”)所对应的数据库表主键Session 缓存Session 接口是 Hibernate 向应用程序提供的操纵对数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载 Java 对象的方法 在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存. 只要 Session 实例没有结束生命周期, 存放在它缓存中的对象也不会结束生命周期 当 session 的 save()方法持久化一个对象时,该对象被载入缓然存,以后即使程序中不再引用该对象,只要缓存不清空,该对象仍处于生命周期中。当试图 load()对象时,会判断缓存中是否存在该对象,有则返回。没有在查询数据库 Session 具有一个缓存 , 位于缓存中的对象称为持久化对象, 它和数据库中的相关记录对应. Session 能够在某些时间点 , 按照缓存中对象的变化来执行相关的 SQL 语句, 来同步更新数据库, 这一过程被称为清理缓存(flush)默认情况下 Session 在以下时间点清理缓存: 当应用程序调用 Transaction 的 commit()方法的时 , 该方法先清理缓存(session.flush(),然后在向数据库提交事务(tx.commit() 当应用程序执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,会先清理缓存,以保证查询结果能够反映持久化对象的最新状态 显式调用 Session 的 flush() 方法清理 session 的缓存的方法: flush: 进行清理缓存 (此时缓存中的数据并不丢失 )的操作,让缓存和数据库同步 执行一些列 sql 语句,但不提交事务 ,; commit:先调用 flush() 方法,然后提交事务 . 则意味着提交事务意味着对数据库操作永久保存下来。 reresh:刷新,让 session 和数据库同步,执行查询,把数据库的最新信息显示出来,更新本地缓存的对象状态. clear:清空缓存,等价于 list.removeAll()Hibernate 对象的四种状态Session 的特定方法能使对象从一个状态转换到另一个状态持久化状态(也叫”托管”)(Persist): OID 不为 null 位于 Session 缓存中 持久化对象和数据库中的相关记录对应 Session 在清理缓存时, 会根据持久化对象的属性变化, 来同步更新数据库 在同一个 Session 实例的缓存中, 数据库表中的每条记录只对应唯一的持久化对象临时状态(transient) : 在使用代理主键的情况下, OID 通常为 null 不处于 Session 的缓存中 在数据库中没有对应的记录游离状态(也叫”脱管”)(Detached): OID 不为 null 不再处于 Session 的缓存中 一般情况需下, 游离对象是由持久化对象转变过来的, 因此在数据库中可能还存在与它对应的记录删除状态(Removed): OID 不为 null 从一个 Session 实例的缓存中删除 Session 已经计划将其从数据库删除, Session 在清理缓存时, 会执行 SQL delete 语句, 删除数据库中的对应记录 一般情况下, 应用程序不该再使用被删除的对象映射组成关系Hibernate 把持久化类的属性分为两种: 值(value) 类型: 没有 OID, 不能被单独持久化, 生命周期依赖于所属的持久化类的对象的生命周期,组件类型就是一种值类型(Address) 实体(entity)类型: 有 OID, 可以被单独持久化, 有独立的生命周期Hibernate 的映射类型: 内置映射类型: java 时间和日期类性Hibernate 的检索策略立即检索: 立即加载检索方法指定的对象延迟检索: 延迟加载检索方法指定的对象 类级别检索策略:* 类级别可选的检索策略包括立即检索和延迟检索,默认为延迟检索* 类级别的检索策略可以通过 元素的 lazy 属性进行设置* 如果程序加载一个对象的目的是为了访问它的属性,可以采取立即检索。如果程序加载一个持久化对象的目的是仅仅为了获得它的引用, 可以采用延迟检索* 无论 元素的 lazy 属性是 true 还是 false, Session 的 get() 方法及 Query 的 list() 方法在类级别总是使用立即检索策略 关联级别的检索策略:* 在映射文件中, 用 元素来配置一对多关联及多对多关联关系. 元素有 lazy 和 fetch 属性 hibernate 检索方式:* 导航对象图检索方式: 根据已经加载的对象导航到其他对象* OID 检索方式: 按照对象的 OID 来检索对象* HQL 检索方式 : 使用面向对象的 HQL 查询语言* QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口. * 本地 SQL 检索方式: 使用本地数据库的 SQL 查询语句Hibernate 的二级缓存 多个事务并发运行时的并发问题对于同时运行的多个事务,当这些事务都在访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题,这些并发问题可归纳为以下几类:* 第一类丢失更新:撤消一个事务时,把其他事务已经提交的数据覆盖* 脏读:一个事务读到了另一事务未提交的的更新数据* 虚读:一个事务读到了另一事务已经提交的新插入的数据* 不可重复读:一个事务读到了另一事务已经提交的更新数据 ANSI 事务隔离级别:* READ_UNCOMMITED:允许你读取还未提交的改变了的数据。可能导致脏、幻、不可重复读* READ_COMMITTED:允许在并发事务已经提交后读取。可防止脏读,但幻读和 不
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号