hibernate培训讲座

上传人:飞****9 文档编号:131965596 上传时间:2020-05-11 格式:PPT 页数:86 大小:1.61MB
返回 下载 相关 举报
hibernate培训讲座_第1页
第1页 / 共86页
hibernate培训讲座_第2页
第2页 / 共86页
hibernate培训讲座_第3页
第3页 / 共86页
hibernate培训讲座_第4页
第4页 / 共86页
hibernate培训讲座_第5页
第5页 / 共86页
点击查看更多>>
资源描述

《hibernate培训讲座》由会员分享,可在线阅读,更多相关《hibernate培训讲座(86页珍藏版)》请在金锄头文库上搜索。

1、对象 关系映射 Hibernate 学员要求 熟悉Java SQL JDBC 掌握面向对象的开发方法 并有实际项目开发经验课程目标 理解O RMapping原理 掌握Hibernate开发的相关知识 并能使用Hibernate进行实际项目开发 作者 赵青 目录 持久层的概念及必要性hibernate框架及核心类介绍hibernate进行持久化的一个例子hibernate如何解决对象和模型的不匹配对象的持久性生命周期对目前项目的进一步封装和思考 数据的持久化 持久化 持久层持久化如何演变为持久层 是不是只要在应用中用了数据库就天然具备了 持久层 了呢 未必 只有持久化而没有持久层 网上商城购物结

2、算的例子 没有持久层的特征 业务逻辑和数据库访问逻辑混杂在一起 没有清晰的界限 干扰了我们的视线 难于理解 业务规则的变动必然影响到数据库的访问逻辑 反之亦然 笨重 难于维护 好处是 简单方便 开发迅速 不需要复杂的设计 比较适合于业务简单的应用 引入持久层后的系统架构 改良后的设计 引入DAO模式 DAO DataAccessorObject数据访问对象数据库访问的实现细节被隐藏到DAO里面 DomainObject则提供了面向领域的对象 封装了具体的业务规则 引入DAO模式的优点 业务层无需关心具体的select insert等操作 使得业务业务逻辑实现更加清晰 也使得开发人员的专业划分成

3、为可能 业务人员专注于业务逻辑编码 业务层和持久层可以彼此独立的变化 比如 仅仅替换数据访问层的实现 可以将系统部署在不同的数据库平台上 改良后的代码 观察DAO的实现细节 问题的症状 用JDBC实现持久层 为域中的每个类手工编写持续性代码的工作量繁重 这些代码基本上都是 支撑性 代码 单调 机械 乏味 不优雅 特别是需要支持多种SQL方言时 对于持久层的开发者是个大难题 新需求的产生 通用的持久层框架 将编写支撑性代码的工作量降到最低 编码是有趣的工作 但是敲键盘决不有趣 凡是无趣的工作都交给机器去完成 对象模型和关系模型的映射 ORM 编码时只需要关心对象 而无需再纠缠于JDBCResul

4、tSet中的字段 更好的移植性 只需要简单的修改配置参数 即可实现底层数据库的切换 目录 持久层的概念及必要性hibernate框架及核心类介绍hibernate进行持久化的一个例子hibernate如何解决对象和模型的不匹配对象的持久性生命周期对目前项目的进一步封装和思考 Hibernate在应用中的位置 基于B S的典型三层架构 开发如何分层 业务逻辑层和持久化层绝不要依赖于展现层 持久层对于业务层是透明的 持久层和业务层的变化是彼此独立的 Hibernate核心架构 Configuration Configuration类负责管理Hibernate的配置信息 它包括如下内容 Hibern

5、ate运行的底层信息 数据库的URL 用户名 密码 JDBC驱动类 数据库Dialect 数据库连接池等 Hibernate映射文件 hbm xml Configurationcfg newConfiguration SessionFactory 会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据 会话工厂在应用初始化时被创建 是一个重量级的类 它在多个应用线程间进行被共享 通常情况下 整个应用只有唯一的一个会话工厂 然而 如果你使用Hibernate访问多个数据库 你需要对每一个数据库使用一个会话工厂 应用程序从会话工厂里获得Session 会话 实例 Session

6、FactorysessionFactory cfg buildSessionFactory Session Session也称为持久化管理器 因为它是与持久化有关的操作接口 Session代表与数据库之间的一次操作 Session通过SessionFactory打开 在所有的工作完成后 需要关闭 会话并不是线程安全的因此应该被设计为每次只能在一个线程中使用 Sessionsession sessionFactory openSession Transaction 事务 Transaction将应用代码从底层的事务实现中抽象出来 可能是一个JDBC事务或一个JTA事务 这有助于保持Hiberna

7、te应用在不同类型的执行环境或容器中的可移植性 使用Hibernate进行操作时 增 删 改 必须显示的调用Transaction 默认 autoCommit false Transactiontx session beginTransaction 目录 持久层的概念及必要性hibernate框架及核心类介绍hibernate进行持久化的一个例子hibernate如何解决对象和模型的不匹配对象的持久性生命周期对目前项目的进一步封装和思考 对象 关系数据库的基本映射 publicclassUser privateStringname privateStringpassword privateLi

8、staddress createtabletbl user namevarchar 255 notnull passwordvarchar 255 primarykey name 一个简单例子 Department hbm xml Hibernate基本数据类型 实例前的准备 项目目录结构 insert Departmentdep newDepartment dep setName 软件开发部 Sessions sessionFactory openSession Transactiontx s beginTransaction s save dep mit s close Load Sess

9、ions sessionFactory openSession Departmentdep Department s get Department class depID s close update Sessions sessionFactory openSession Transactiontx s beginTransaction Departmentdep Department s get Department class depID dep setName ggggg s update dep mit s close delete Sessions sessionFactory op

10、enSession Transactiontx s beginTransaction Departmentdep Department s get Department class depID s delete dep mit s close 使用Ant构建开发过程 AnotherNeatTool另一个整洁的工具 ANT是一个基于Java的自动化脚本引擎 脚本格式为XML 每个ant脚本 缺省叫build xml 中设置了一系列任务 target 而多个任务之间往往又包含了一定的依赖关系 Ant可以简化项目的编译 测试 文档 部署等日常工作的手工工作量 进一步减少编码量 XDoclet XDo

11、clet的灵感来自JavaDoc JavaDoc把文档写在代码里 简化了文档与程序同步问题 为web ejb struts webwork hibernate jdo jmx等等生成描述文件 源码等 现在的XDoclet已经发展成了一个全功能的 面向属性的代码生成框架 Attribute OrientedProgramming 目录 持久层的概念及必要性hibernate框架及核心类介绍hibernate进行持久化的一个例子hibernate如何解决对象和模型的不匹配对象的持久性生命周期对目前项目的进一步封装和思考 Hibernate面临的挑战 对象 关系模型的不匹配 ParadigmMism

12、atch 粒度问题 granularity 子类型问题 subtypes 同一性问题 identity 关联问题 associations 对象导航问题 navigation Identity 同一性问题 对象的同一性 identity 是jvm定义的概念 对象的相等性 equality javaAPI定义的方法 实现equals 方法 数据库对象的同一性 identity 指向同一个表的同一个记录 DatabaseidentitywithHibernate 为持久化类增加一个identifierproperty Identifier的值等于数据库中该记录的主键值 对于业务而言没有实际意义 一

13、般该属性命名为id 通常设置getID 为public 因为通过id查找对象会很方便 而setID 设为private 其值由hibernate产生 id不可以改变 a b a equals b a getID equals b getID 主键的选择 naturalkeys 从业务意义上寻找一个或者多个属性来区分唯一性 和是否是自动产生的无关 业务逻辑和数据逻辑位于不同的层面 应该有清晰的界定 不要把业务逻辑牵扯到数据逻辑中 否则业务逻辑的变化将对数据逻辑产生根本的影响 syntheticidentifiers surrogatekeys surrogatekeys没有业务含义 它是由数据库

14、或者应用产生的 compositekeys 多个naturalkeys联合组成的primarykey 历史的遗留系统无法避免 identifiergenerator 主键生成策略 native hibernate将根据底层数据库的方言 Dialect 来选择 SQLServer用identity Oracle用sequence等 increment 主键按数值顺序递增 此方式的实现机制为在当前应用实例中维持一个变量 以保存着当前的最大值 之后每次需要生成主键的时候将此值加1作为主键 应用于single server的环境下特别高效 如果被部署成多个应用的环境 会造成主键重复错误 uuid he

15、x 用一个128 bit的UUID算法生成字符串类型的标识符 使用了IP地址 JVM的启动时间 精确到1 4秒 系统时间和一个计数器值 在JVM中唯一 用该算法生成的id可以确保在一个网络中唯一 适用于多应用的环境 即使在多实例并发的环境中也可以确保唯一 并且解决了多个数据库的部分数据合并 granularity 粒度问题 fine grainedobjectmodel适当的细粒度对象模型 所谓细粒度模型 就是将原本业务模型中的对象加以细分 从而得到更加精细的对象模型 细粒度模型的设计 该设计体现了一个 合成 的关系 composition 即整体和部分的关系 部分不可独立存在而依赖于整体 s

16、endMessage 这种细粒度的设计更好的体现了类的内聚性 体现了对象设计的职责分配原则 将职责分配给拥有履行一个职责所必需信息的类 数据库设计的思考 这样的设计是不必要的 并且存在性能问题 EntityandComponent 在Java中不存在实体类和component类的区别 所有类的含义都是相同的 持久化的类需要对应数据库的表 而表中记录的唯一性是通过主键实现的 故持久化的类需要区分实体类和component类 Entity类有数据库的主键值 Entity类有自己的生命周期 它不依赖于其他的类而独立存在 component类没有相应的主键值 它从属于Entity 它的生命周期从属于Entity 随着Entity的消亡而消亡 component类也称valuetype 映射文件的格式 Subtypes 子类型问题 对象模型存在 isa 和 hasa 的关系 而关系模型仅仅存在 hasa 的关系 这是对象模型和关系模型最明显的mismatch 如何将 isa 转化为数据库中的 hasa 是hibernate需要解决的问题 Tableperconcreteclass 这是最简单的一

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号