Hibernate中持久化类 提供一个无参数 public构造器 提供一个标识属性,映射数据表主键字段 所有属性提供public访问控制符的 set get 方法 标识属性应尽量使用基本数据类型的包装类型 不要用final修饰实体 (将无法生成代理对象进行优化) 对象状态与一级缓存 lhibernate 规定三种状态:瞬时态、持久态、脱管态 瞬时态:与session无关联,数据库也没有对应记录。 持久态:与session有关联,数据库最终会有记录。(事务没有提交) 脱管态(游离态):与session无关联,数据库有记录。 相对于SQL,HQL查询语言有什么特点sql是关系数据库语言,面对的数据库;而hql是Hibernate内置查询语言,虽然他们的目的都是为了从数据库查询需要的数据,但sql操作的是数据库表和字段,而作为面向对象的hql操作的则是持久化类及其属性, 什么是延迟加载?在实际应用中,延迟加载与Session关闭的矛盾是如何处理的? 延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。Hibernate使用了代理机制实现延迟加载,我们使用Session的load()方法加载数据或者一对多关联映射在使用延迟加载的情况下从一的一方加载多的一方,得到的都是代理对象,代理对象在用户使用这些数据时才会去数据库加载数据。但加载数据就需要数据库连接。而当我们把会话关闭时,数据库连接就同时关闭了。 延迟加载与session关闭的矛盾一般可以这样处理: ① 关闭延迟加载特性。这种方式操作起来比较简单,但是如果去掉延迟加载的话,每次查询的开销都会变得很大。
② 在session关闭之前先获取需要查询的数据。 ③ 使用拦截器或过滤器延长Session的生命周期直到视图获得数据。Spring整合Hibernate提供的OpenSessionInViewFilter和OpenSessionInViewInterceptor就是这种做法。 一级缓存 l一级缓存:又称为session级别的缓存。当获得一次会话(session),hibernate在session中创建多个集合(map),用于存放操作数据(PO对象),如果之后需要相应的数据,hibernate优先从session缓存中获取,如果有就使用;如果没有再查询数据库。当session关闭时,一级缓存销毁。 一级缓存快照 l快照:与一级缓存一样的存放位置,对一级缓存数据备份。保证数据库的数据与 一级缓存的数据必须一致。如果一级缓存修改了,在执行commit提交时,将自动刷新一级缓存,执行update语句,将一级缓存的数据更新到数据库。 Hibernate 检索方式 1.导航对象图检索方式: 根据已经加载的对象导航到其他对象 2.OID 检索方式: 按照对象的 OID 来检索对象 3.HQL 检索方式: 使用面向对象的 HQL 查询语言 4.QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口. 5.本地 SQL 检索方式: 使用本地数据库的 SQL 查询语句 HQL和QBC的各有什么优缺点(面试题) 1.可读性:HQL和SQL查询语言比较接近,比较容易读懂,而QBC检索方式把查询语句肢解为一组Criteria对象,可读性较差。 2.功能:HQL功能强大,支持多种查询,而QBC没有HQL功能强大,列入,不支持报表查询和子查询,且对连接查询也有很多限制 3.查询语句形式:HQL是基于字符串形式的查询语句。而QBC检索方式封装了基于字符串形式的查询语句,提供了更加面向对象的接口 4.解析的时机不同。HQL查询语句只有在程序运行时才会被解析,而QBC在程序编译时就能被解析,因此更加容易排错 5.可拓展性:HQL不具有拓展性,而QBC允许用户拓展Criteria接口 6.对动态查询语句的支持:HQL支持生成动态查询语句,但是比较麻烦 使用内连接返回list中每部分是数组, 迫切内连接返回list每部分是对象 Hibernate 检索(抓取)策略 抓取策略(fetching strategy) 是指:当应用程序需要在关联关系间进行导航的时候, Hibernate如何获取关联对象的策略。
|