




已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
HibernateHibernate 学习笔记学习笔记 JavaJava 相关课程系列笔记之十四相关课程系列笔记之十四 笔记内容说明笔记内容说明 Hibernate 梁建全老师主讲 占笔记内容 100 1 目目 录录 一 Hibernate 的概述 1 1 1 Hibernate 框架的作用 1 1 2 Hibernate 访问数据库的优点 1 1 3 JDBC 访问数据库的缺点 1 1 4 Hibernate 的设计思想 1 二 Hibernate 的基本使用 2 2 1 Hibernate 的主要结构 2 2 2 Hibernate 主要的 API 2 2 3 Hibernate 使用步骤 2 2 4 HQL 语句 简要介绍 6 三 数据映射类型 7 3 1 映射类型的作用 7 3 2 type 映射类型的两种写法 7 四 Hibernate 主键生成方式 8 4 1 五种生成方式 8 五 Hibernate 基本特性 9 5 1 对象持久性 9 5 2 处于持久状态的对象具有的特点 9 5 3 三种状态下的对象的转换 9 5 4 批量操作 注意及时清除缓存 9 5 5 案例 三种状态下的对象使用 10 5 6 一级缓存机制 默认开启 10 5 7 一级缓存的好处 10 5 8 管理一级缓存的方法 10 5 9 延迟加载机制 11 5 10 具有延迟加载机制的操作 11 5 11 常犯的错误 12 5 12 延迟加载的原理 12 5 13 Session 的 get 和 load 方法的区别 12 5 14 延迟加载的好处 12 5 15 案例 测试延迟加载 12 5 16 案例 重构 NetCTOSS 资费管理模块 13 5 17 Java Web 程序中如何用延迟加载操作 OpenSessionInView 15 六 关联映射 18 6 1 一对多关系 one to many 18 6 2 多对一关系 many to one 19 6 3 多对多关联映射 many to many 19 6 4 关联操作 查询 join fetch 级联 cascade 21 6 5 继承关系映射 24 七 Hibernate 查询方法 27 7 1 HQL 查询 27 7 2 HQL 和 SQL 的相同点 27 2 7 3 HQL 和 SQL 的不同点 27 7 4 HQL 典型案例 27 7 5 Criteria 查询 30 7 6 Native SQL 原生 SQL 查询 31 八 Hibernate 高级特性 32 8 1 二级缓存 32 8 2 二级缓存开启方法及测试 32 8 3 二级缓存管理方法 33 8 4 二级缓存的使用环境 33 8 5 查询缓存 33 8 6 查询缓存开启方法及测试 33 8 7 查询缓存的使用环境 33 九 Hibernate 锁机制 34 9 1 悲观锁 34 9 2 悲观锁的实现原理 34 9 3 悲观锁使用步骤及测试 34 9 4 乐观锁 35 9 5 乐观锁的实现原理 35 9 6 乐观锁使用步骤及测试 35 十 其他注意事项 36 10 1 源码服务器管理工具 36 10 2 利用 MyEclipse 根据数据表自动生成实体类 hbm xml 36 10 3 根据实体类和 hbm xml 生成数据表 37 10 4 Hibernate 中分页查询使用 join fatch 的缺点 37 10 5 Hibernate 的子查询映射 38 1 1 Hibernate 的的概概述述 1 1 Hibernate 框架的作用 Hibernate 框架是一个数据访问框架 也叫持久层框架 可将实体对象变成持久对象 详见第 5 章 通过 Hibernate 框架可以对数据库进行增删改查操作 为业务层构建一个持久 层 可以使用它替代以前的 JDBC 访问数据 1 2 Hibernate 访问数据库的优点 1 简单 可以简化数据库操作代码 2 Hibernate 可以自动生成 SQL 可以将 ResultSet 中的记录和实体类自动的映射 转 化 3 Hibernate 不和数据库关联 是一种通用的数据库框架 支持 30 多种数据库 可以 方便数据库移植 任何数据库都可以执行它的 API 因为 Hibernate 的 API 中是不涉及 SQL 语句的 它会根据 Hibernate 的配置文件 自动生成相应数据库的 SQL 语句 1 3 JDBC 访问数据库的缺点 1 需要编写大量的复杂的 SQL 语句 表字段多时 SQL 也繁琐 设置各个问号值 2 需要编写实体对象和记录之间的代码 较为繁琐 3 数据库移植时需要修改大量的 SQL 语句 1 4 Hibernate 的设计思想 Hibernate 是基于 ORM Object Relation Mapping 思想设计的 称为对象关系映射 负 责 Java 对象和数据库表数据之间的映射 Hibernate 是一款主流的 ORM 工具 还有其他很多 ORM 工具 如 MyBatis 以前叫 iBatis JPA Hibernate 功能比 MyBatis 强大些 属于全自动类型 MyBatis 属于半自动 但全自动会有些不可控因素 因此有些公司会用 MyBatis ORM 工具在完成 Java 对象和数据库之间的映射后 1 在查询时 直接利用工具取出 对象 不论是查询一条记录还是多条记录 取出的 都是一个个对象 我们不用再去转化实体了 2 在增删改操作时 直接利用工具将 对象 更新到数据库表中 我们不用再去把对 象转成数据了 3 中间的 SQL JDBC 细节 都被封装在了工具底层 不需要程序员参与 注意事项 Java 程序想访问数据库 只能通过 JDBC 的方式 而 Hibernate 框架也就是基 于 ORM 思想对 JDBC 的封装 Hibernate 是以 对象 为单位进行数据库的操作 2 2 Hibernate 的的基基本本使使用用 2 1 Hibernate 的主要结构 1 hibernate cfg xml 仅 1 个 Hibernate 的主配置文件 主要定义数据连接参数和框 架设置参数 注意事项 就是个 xml 文件 只是名字比较奇葩 2 Entity 实体类 n 个 一个表一个 主要用于封装数据库数据 3 hbm xml 映射文件 n 个 主要描述实体类和数据表之间的映射信息 描述表与 类 字段与属性的对应关系 注意事项 hbm xml 是个后缀 如 命名可写 Cost hbm xml 2 2 Hibernate 主要的 API 1 Configuration 用于加载 hibernate cfg xml 配置信息 用于创建 SessionFactory 2 SessionFactory 存储了 hbm xml 中描述的信息 内置了一些预编译的 SQL 可以创 建 Session 对象 3 Session 负责对数据表执行增删改查操作 表示 Java 程序与数据库的一次连接会话 是对以前的 Connection 对象的封装 和 JSP 中的 session 不是一回事 就是名字一样而已 4 Query 负责对数据表执行特殊查询操作 5 Transaction 负责 Hibernate 操作的事务管理 默认情况下 Hibernate 事务关闭了自 动提交功能 需要显式的追加事务管理 如调用 Transaction 对象中的 commit 提交事务 注意事项 这些 API 都是在 Hibernate 包下的 导包别导错 第一次访问数据库比较慢 比较耗资源 因为加载的信息多 2 3 Hibernate 使用步骤 step1 建立数据库表 step2 建立 Java 工程 Web 工程也可 引入 Hibernate 开发包和数据库驱动包 必须引入 的包 hibernate3 jar cglib jar dom4j jar commons collections jar commons logging jar 等 step3 添加 hibernate cfg xml 配置文件 文件内容如下 org hibernate dialect OracleDialect jdbc oracle thin localhost 1521 dbchang 3 system chang oracle jdbc driver OracleDriver true true 注意事项 应该放在源文件的 src 目录下 默认为 hibernate cfg xml 文件内容是 Hibernate 工作时必须用到的基础信息 step4 编写 Entity 实体类 也叫 POJO 类 例如 资费实体类 Cost private Integer id 资费 ID private String feeName 资费名称 private Integer baseDuration 基本时长 private Float baseCost 基本定费 private Float unitCost 单位费用 private String status 0 开通 1 暂停 private String descr 资费信息说明 private Date createTime 创建日期 private Date startTime 启用日期 private String costType 资费类型 getter setter 方法 注意事项 POJO 类表示普通类 Plain Ordinary Old Object 没有格式的类 只有 属性和对应的 getter setter 方法 而没有任何业务逻辑方法的类 这种类最多再加 4 入 equals hashCode toString 等重写父类 Object 的方法 不承担任何实现业 务逻辑的责任 step5 编写 hbm xml 映射 文件 描述信息 映射文件用于指明 POJO 类和表之间的映射 关系 xx 属性对应 xx 字段 一个类对应一个映射文件 例如 Cost hbm xml 内容如下 表明此为主键列 且必须写否则 xml 报错 主键映射 或双标签 COST SEQ CHANG 也可写成 主键列同理 其他省略 注意事项 映射文件默认与 POJO 类放在一起 命名规则为 类名 hbm xml hbm xml 中已写出的属性与字段的映射要一一对应 若表中没有某个字段 却 写了映射关系 则报错 找不到实体类 step6 利用 Hibernate API 实现 DAO 5 1 新建 HibernateUtil 类 用于封装创建 Session 的方法 如下 每个用户会对应一个 Session 但是 SessionFactory 是共享的 public class HibernateUtil private static SessionFactory sf static 不用每次都加载配置信息 所以放 static 块中 否则每次都加载会耗费资源 Configuration conf new Configuration 加载主配置 hibernate cfg xml conf configure hibernate cfg xml sf conf buildSessionFactory 获取 SessionFactory public static Session getSession 获取 Session Session session sf openSession return session 2 新建 CostDAO 接口 public Cost findById int id public void save Cost cost public void delete int id public void update Cost cost public List findAll 3 新建 CostDAOImpl 类 用于实现 CostDAO 接口 public class CostDAOImpl implements CostDAO private Session session public CostDAOImpl 不想老写获得 session 的方法 就写在构造器中 session HibernateUtil getSession get 方法执行查询 按主键当条件查询 如何判断是主键 是根据写的描述文件来定 get 方法就是 findById 就是按主键去查 需指定 操作哪个类和 id 主键 条件值即可 其他条件查询做不了 public Cost findById int id Session session HibernateUtil getSession Cost cost Cost session get Cost class id session close return cost save 方法执行增加操作 注意 1 获取事务并开启 增删改要注意 查询可以不管 事务 因为没对数据库进行修改 注意 2 主键值根据 hbm xml 中的定义生成 执行后 会先获取序列值 再去做 insert 操作 即先 select COST SEQ CHANG nextval from dual 然后 insert into public void save Cost cost Session session HibernateUtil getSession Transaction tx session beginTransaction 打开事务session save cost mit 提交事务session close 释放 delete 方法执行删除操作 由于 Hibernate 以 对象 为单位进行数据库操作 所以 这里要传进去一个对象 虽然是个对象 但还是按主键做条件删除 只要把主键值设置上就 行 其他非主键值不用管 也可先通过 id 查再删 public void delete int id Session session HibernateUtil getSession Transaction tx session beginTransaction Cost cost new Cost cost setId id session delete cost mit session close update 方法执行修改操作 public void update Cost cost Session session HibernateUtil getSession Transaction tx session beginTransaction 6 session update cost 将 cost 对象更新到数据库mit session close 特殊查询 SQL 语句 String sql select from COST CHANG HQL 语句 String hql from Cost Hibernate Query Language 是面向对象的查询语 句 from 后写映射的类名 它是 Hibernate 中特有的查询语句 根据映射的类去查询 public List findAll Session session HibernateUtil getSession String hql from Cost HQL 语句 Query query session createQuery hql List list query list 执行查询 返回 List 集合 session close return list 4 新建 TestCostDAO 类 使用 junit 测试 Test public void testFindById 当 get 方法没有记录时 返回 null CostDAO costDao new CostDAOImpl Cost cost costDao findById 1 System out println cost getName System out println cost getBaseDuration System out println cost getBaseCost System out println cost getUnitCost System out println cost getDescr Test public void testSave id 主键列由 Hibernate 管理 这里不用设置 Cost cost new Cost cost setName 2013 计时 cost setUnitCost 0 8f cost setDescr 2013 08 09 计时 0 8 元 小时 cost setStatus 0 cost setCreaTime new Date System currentTimeMillis CostDAO costDao new CostDAOImpl costDao save cost Test public void testUpdate 开通某个资费 把状态由 0 变为 1 CostDAO costDAO new CostDAOImpl 注意事项 更新部分字段 不能和实现类中的删除那样 做一个对象出来 否 则没设置的字段将被改为空 即不能 Cost cost new Cost cost setId 90 cost setStatus 1 cost setStartTime new Date System currentTimeMillis Cost cost costDAO findById 90 只能先通过 id 找到带有所有值的对象 cost setStatus 1 然后再对部分字段进行更新 才能避免把其他字段更新为 空 cost setStartTime new Date System currentTimeMillis costDAO update cost Test public void testDelete CostDAO costDAO new CostDAOImpl costDAO delete 90 Test public void testFindAll CostDAO costDAO new CostDAOImpl List list costDAO findAll for Cost c list System out println c getName 7 2 4 HQL 语句 简要介绍 简要介绍见 2 3 节中 step6 中的 3 特殊查询 本页最上 详细介绍见第七章 8 3 数数据据映映射射类类型型 hbm xml 在描述字段和属性映射时 采用 type 属性来指定映射类型 3 1 映射类型的作用 主要负责实现属性和字段值之间的相互转化 3 2 type 映射类型的两种写法 1 指定 Java 类型 例如 java lang String java lang Integer 不能写成 String 2 指定 Hibernate 类型 例如 整数 byte short integer long 浮点数 float double 字符串 string 日期和时间 date 只处理年月日 time 只处理时分秒 timestamp 处理年 月日时分秒 布尔值 true falsechar 1 数据库存 Y N 显示时自动转为 true false true falsechar 1 数据库存 T F 显示时自动转为 true false true falsebit 数据库存 1 0 显示时自动转为 true false 其他 blob 以字节为单位存储大数据 clob 以字符为单位存储大数据 big decimal big integer 注意事项 Hibernate 类型都是小写 建议使用 Hibernate 类型 3 所以 2 3 节中 step5 的 Cost hbm xml 内的 type 也可这样写 注意事项 java util Date 有年月日时分秒毫秒 但如果用 date 映射 则只把年月日存进数 据库 java sql Date 只有年月日 java sql Timestamp 有年月日时分秒毫秒 若在页面显示按特定格式显示则用 Struts2 标签 9 10 4 Hibernate 主主键键生生成成方方式式 Hibernate 负责管理主键值 它提供了多种主键生成方式 4 1 五种生成方式 1 sequence 可以按指定序列生成主键值 只适用于 Oracle 数据库 不担心并发量 例如 序列名字 注意事项 创建序列时如果不指定参数 默认从 1 开始 步进是 1 2 identity 按数据库自动增长机制生成主键值 一般适用于 MySql SQLServer 数据 库 例如 3 native Hibernate 会根据方言类型不同 选择不同的主键生成方式 如果是 OracleDialect 则会选择 sequence 如果是 MySQLDialect 则会选择 identity 例如 注意事项 如果是 MySql 数据库 序列名字是 不起作用的 但也不会出错 如果是 Oracle 数据库 序 列名字就会起作用 所以一般我们会加上这句话 这样通用性更强 4 assigned Hibernate 会放弃主键生成 采用此方法 需要在程序中指定主键值 例如 5 increment Hibernate 先执行 select max id 语句获取当前主键的最大值 执行加 1 操作 然后再调用 insert 语句插入 Oracle 和 MySQL 都可用 但不适合并发量很大的情况 例如 6 uuid hilo uuid 按 UUID 算法生成一个主键值 字符串类型 hilo 按高低位算法 生成一个主键值 数值类型 例如 注意事项 主键一般都是自动生成的 我们一般不使用业务数据作为主键 因为业务逻辑 的改变有可能会改变主键值 主键生成方式是枚举类型 只能从一个有限的范围内选择 不能自定义 其中 sequence 是使用序列生成主键 Oracle 数据库经常使用 11 5 Hibernate 基基本本特特性性 5 1 对象持久性 在 Hibernate 使用过程中 实体对象可以具有以下三种状态 1 临时状态 采用 new 关键字创建的对象 该对象未与 Session 发生关联 未调用 Session 的 API 也叫临时对象 临时状态的对象会被 Java 的垃圾回收机制回收 2 持久状态 实体对象与 Session 发生关联 调用了 Session 的 get load save update 等 API 也叫持久对象 3 游离状态 原来是持久状态 后来脱离了 Session 的管理 如 Session 被关闭 对 象将从持久状态变为游离状态 同时垃圾回收机制可以回收掉 不再占用缓存空间了 5 2 处于持久状态的对象具有的特点 1 对象生命期持久 垃圾回收机制不能回收 2 对象的数据可以与数据库同步 即对象中的数据发生改变 则数据库中的数据自动 同步 由 Session 对象负责管理和同步 3 对象在 Session 的一级缓存中存放 或者说在 Session 缓存中的对象都是持久对象 注意事项 Session close 有两个作用 关闭连接 释放资源 使对象变为游离 状态 当对象的引用不存在时 对象才被回收 没被回收时 对象中的数据还在 5 3 三种状态下的对象的转换 5 4 批量操作 注意及时清除缓存 Transaction tx session beginTransaction for int i 0 i class 载入类加载器 执行 延迟加载 javassist jar cglib jar 生成新类型 类加载器 执行 5 13 Session 的 get 和 load 方法的区别 1 相同点 两者都是按 主键 做条件查询 2 不同点 get 是立刻加载 load 是延迟加载 get 返回的对象类型是实体类型 load 返回的是动态生成的一个代理类 动态 代理技术 该代理类是实体类的子类 get 未查到数据返回 null load 未查到数据抛出 ObjectNotFoundException 异常 注意事项 若实体类用了 final 修饰 则破坏了延迟加载机制 那么 load 效果与 get 就完全相同了 5 14 延迟加载的好处 1 提高了内存的使用效率 2 可以使数据访问降低并发量 15 5 15 案例 测试延迟加载 Test public void test1 Session session HibernateUtil getSession load 是延迟加载 foo 没有数据 Foo foo Foo session load Foo class 1 此时还没去数据库查询 session close 放这里报错 session 关的过早 could not initialize proxy no Session System out println foo getName 第一次调用属性的 getter 方法时触发查询 session close 放这里不报错 对象没被回收 System out println foo getSalary Test public void test2 Session session HibernateUtil getSession Foo foo Foo session load Foo class 1 此时还没去数据库查询 类 org tarena entity Foo EnhancerByCGLIB 87e5f322 由 cglib jar 生产 System out println foo getClass getName session close 5 16 案例 重构 NetCTOSS 资费管理模块 step1 引入 Hibernate 开发框架 jar 包和主配置文件 step2 采用 Hibernate 操作 COST CHANG 表 1 添加实体类 private Integer id 资费 IDprivate String name 资费名称 NAME private Integer baseDuration 包在线时长 BASE DURATION private Float baseCost 月固定费 BASE COST private Float unitCost 单位费用 UNIT COST private String status 0 开通 1 暂停 STATUS private String descr 资费信息说明 DESCR private Date startTime 启用日期 STARTTIME private Date creaTime 创建时间 CREATIME 2 追加 Cost hbm xml COST SEQ CHANG 16 其他略 注意事项 实体类和 hbm xml 必须保持一致 列名写错则会报 不能读取实体类 junit 测试右键点 Copy Trace 查看错误列 step3 借用 2 3 节中 step6 的 HibernateUtil 类 step4 按 CostDAO 接口重构一个 DAO 实现组件 HibernateCostDAOImpl public void delete int id throws DAOException Session session HibernateUtil getSession Transaction tx session beginTransaction Cost cost new Cost cost setId id session delete cost mit session close public List findAll throws DAOException Session session HibernateUtil getSession Transaction tx session beginTransaction String hql from Cost Query query session createQuery hql List list query list mit session close return list public List findAll int page int rowsPerPage throws DAOException Session session HibernateUtil getSession 分页查询 Transaction tx session beginTransaction String hql from Cost Query query session createQuery hql int start page 1 rowsPerPage 设置分页查询参数 query setFirstResult start 设置抓取记录的起点 从 0 开始 第一条 记录 query setMaxResults rowsPerPage 设置抓取多少条记录 List list query list 按分页参数查询 mit session close return list public Cost findById Integer id throws DAOException Session session HibernateUtil getSession Transaction tx session beginTransaction Cost cost Cost session load Cost class id mit String name cost getName session close return cost public Cost findByName String name throws DAOException select from COST CHANG where NAME String hql from Cost where name Session session HibernateUtil getSession Transaction tx session beginTransaction Query query session createQuery hql query setString 0 name 注意 Hibernate 赋值从 0 开始 即第一个问号 Cost cost Cost query uniqueResult 适用于只有一行查询结果返回 如果返回记录为多条 则会报错 多条用 query list mit session close return cost public int getTotalPages int rowsPerPage throws DAOException select count from COST CHANG 17 String hql select count from Cost 类名 Session session HibernateUtil getSession Transaction tx session beginTransaction Query query session createQuery hql Object obj query uniqueResult int totalRows Integer parseInt obj toString mit session close if totalRows rowsPerPage 0 return totalRows rowsPerPage else return totalRows rowsPerPage 1 public void save Cost cost throws DAOException Session session HibernateUtil getSession Transaction tx session beginTransaction 下面的设置属性建议写到 Action 中 cost setStatus 1 cost setCreaTime new Date System currentTimeMillis session save cost mit session close public void update Cost cost throws DAOException Session session HibernateUtil getSession Transaction tx session beginTransaction 下面设置属性建议写到 Action 中 不写 DAO 中 因为 update 有通用性可封装 到时无法确定 setXX 方法 Cost cost1 Cost session get Cost class cost getId cost1 setName cost getName cost1 setBaseDuration cost getBaseDuration cost1 setUnitCost cost getUnitCost cost1 setDescr cost getDescr session update cost1 mit session close step5 修改 DAOFactory private static CostDAO costDAO new HibernateCostDAOImpl 5 17 Java Web 程序中如何用延迟加载操作 OpenSessionInView 1 Java Web 程序工作流程 action Action DAO 延迟 API JSP 利用标签或 EL 获取数据 会触发延 迟加载数据 生成响应 HTML 页面给浏览器 2 基于上述原因 在 DAO 中不能关闭 Session 需要将 Session 关闭放到 JSP 解析之后 把 Session 的关闭延迟到 View 组件运行完之后 这种模式被称为 OpenSessionInView 3 OpenSessionInView 和 ThreadLocal 使用 OpenSessionInView 必须满足 Session 的线程单例 一个线程分配一个 Session 在该线程的方法中可以获得该 Session 具体使用 ThreadLocal 一个线程为 key 的 Map Hibernate 支持的 Session 线程单例 配置文件中 thread 然后调用 sessionFactory getCurrentSession 自动实现线程单例 4 OpenSessionInView 模式也可以采用以下技术实现 利用 Struts2 的拦截器 将关闭 session 的操作写在拦截器中 step1 基于 ThreadLocal 技术改造 2 3 中 step6 的 HibernateUtil 类 public class HibernateUtil private static SessionFactory sf private static ThreadLocal sessionLocal new ThreadLocal 18 static 不用每次都加载配置信息 所以放 static 块中 否则耗费资源 Configuration conf new Configuration conf configure hibernate cfg xml 加载主配置 hibernate cfg xml sf conf buildSessionFactory 获取 SessionFactory 同一个线程 只创建一个 session 创建出来后利用 ThreadLocal 将 session 与当 前线程绑定 public static Session getSession Session session sessionLocal get if session null 当前线程第一次调用 创建一个 session sf openSession sessionLocal set session 将 session 存取 ThreadLocal return session 如果能取到 session 说明当前线程已经创建过 session 把关闭 session 也封装一下 public static void closeSession Session session sessionLocal get sessionLocal set null if session isOpen session close 关闭 session 和释放 ThreadLocal 空间 简单测试一下 public static void main String args Session session1 HibernateUtil getSession Session session2 HibernateUtil getSession System out println session1 session2 true step2 创建拦截器 public class OpenSessionInViewInterceptor extends AbstractInterceptor 继承抽象类 Override public String intercept ActionInvocation arg0 throws Exception Session session HibernateUtil getSession 开启事务 或 Transaction tx session getTransaction tx begin Transaction tx session beginTransaction 等于以上两步 System out println 开启事务 try arg0 invoke 执行 action result jsp if tx wasCommitted 当两个 action 连续调用时 避免重复提交 mit 提交事务 System out println 提交事务 return null catch Exception e tx rollback 回滚事务 System out println 回滚事务 e printStackTrace throw e 受 AbstractInterceptor 类影响 必须 抛异常 finally HibernateUtil closeSession 关闭 session System out println 关闭事务 注意事项 重复提交的情况 redirectAction add action 拦截器开启事务 AddCostAction 拦截器开启事务 ListCostAction cost list jsp 拦截器提 交事务 拦截器提交事务 step3 在 NetCTOSS 项目中的 struts cost xml 中配置拦截器 添加内容如下 19 step4 将 5 16 案例中 step4 中的 HibernateCostDAOImpl 类里的所有方法中的 开启事务 提交事务 关闭 Session 全部删除 利用 Filter 过滤器 public void doFilter request response chain 前期处理逻辑 chain doFilter request response 调用后续 action result 组件 后期处理逻辑 关闭 session 利用 Spring 的 AOP 机制 20 6 关关联联映映射射 关联映射主要是在对象之间建立关系 开发者可以通过关系进行信息查询 添加 删除 和更新操作 如果不使用 Hibernate 关联关系映射 我们也可以取到用户对应的服务 Account account Account session get Account class 1 取到用户信息 String hql from Service s where s accountId 1 Query query session createQuery hql 取到用户对应的服务 List list query list 而 Hibernate 提供的关联映射 更方便一些 6 1 一对多关系 one to many step1 新建项目 导入 Hibernate 开发包 借用 NetCTOSS 项目中的实体 Account 和 Service 配置 hibernate cfg xml 和两个实体的 hbm xml 映射文件 step2 一个 Account 帐号对应多个 Service 服务 所以为一对多关系 因此为 One 方 Account 实体类添加 Set 集合属性 以及对应的 get set 方法 追加属性 用于存储相关联的 Service 信息 private Set services new HashSet step3 在 One 方 Account hbm xml 映射文件中 加入 Set 节点的映射 简单说明 具体实现 是 list 集合用 set 集合用 step4 借用 5 17 节 4 中的 step1 中的 HibernateUtil 类 step5 新建 TestOneToMany java 类用于测试 Test public void test1 Session session HibernateUtil getSession Account account Account session load Account class 1011 第一次发送 SQL 查询 System out println account getRealName System out println account getIdcardNo 显示与当前帐号相关的 Service 业务帐号 以前的方式需要写 hql String hql from Service where ACCOUND ID 1011 用了关联映射则不用写 hql 了 Set services account getServices 延迟加载 第二次发送 SQL 查询 for Service s services 21 System out println s getId s getOsUsername s getUnixHost session close 6 2 多对一关系 many to one step1 新建项目 导入 Hibernate 开发包 借用 NetCTOSS 项目中的实体 Account 和 Service 配置 hibernate cfg xml 和两个实体的 hbm xml 映射文件 step2 可多个 Service 服务对应一个 A
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 禁牧合同(标准版)
- 2025河北承德桥东街道办事处高校毕业生临时性公益性岗位招聘工作1人备考试题及答案解析
- 房地产收购合同(标准版)
- 软件项目开发进度保证措施
- 智能化医院产后出血应急演练流程
- 人教部编版七年级历史下册学生兴趣培养计划
- 2025年中医针灸学经络穴位推拿技能操作与病例解读模拟考卷答案及解析
- StarterUnit2SectionB教案-七年级英语人教版上册
- 2025年骨质疏松症诊断与治疗综合评估答案及解析
- 三年级上册作文基础提升专项复习及范文
- 创新教学方法:提升学习效果培训课件
- 高频电灼仪产品技术要求深圳半岛医疗
- 项目幕墙施工方案
- (完整word版)劳动合同书(电子版)正规范本(通用版)
- 我这样做老师
- 垃圾焚烧发电项目电气安装与调试施工方案
- 枣庄市专业技术人员继续教育公需科目2021年度补考题库及卫生专科课题库
- 高考作文答题卡(作文)
- GB/T 3921-2008纺织品色牢度试验耐皂洗色牢度
- 液压与气压传动 第2版 马振福 高职课件0、1新
- DB3302T 1079-2018 管线探测技术规程
评论
0/150
提交评论