hibernate总结
总结
1.Hibernate工作原理及为什么要用?
- 读取并解析配置文件
- 读取并解析映射信息,创建SessionFactory
- 打开Sesssion
- 创建事务Transation
- 持久化操作
- 提交事务
- 关闭Session
- 关闭SesstionFactory
使用Hibernate框架就不用我们写很多繁琐的SQL语句。Hibernate实现了ORM,能够将对象映射成数据库表,从而简化我们的开发!
2.Hibernate是如何延迟加载(懒加载)?
通过设置属性lazy进行设置是否需要懒加载。
3.hibernate的三种状态之间如何转换。
瞬时态(临时态、自由态):不存在持久化标识 OID,尚未与 Hibernate Session 关联对象, 被认为处于瞬时态,失去引用将被 JVM 回收
持久态:存在持久化标识 OID,与当前 session 有关联,并且相关联的 session 没有关闭 , 并且事务未提交
脱管态(离线态、游离态):存在持久化标识 OID,但没有与当前 session 关联,脱管状态 改变 hibernate 不能检测到
new出来的对象是瞬时状态->保存到数据库中(受Session管理)就是持久化状态->将session close掉就是游离状态
4.hibernate都支持哪些缓存策略
usage的属性有4种:
- 放入二级缓存的对象,只读(Read-only);
- 非严格的读写(Nonstrict read/write)
- 读写; 放入二级缓存的对象可以读、写(Read/write);
- 基于事务的策略(Transactional)
5.Hibernate的缓存机制
Hibernate 一级缓存(Session 的缓存):
(1)Session 实现了第一级 Cache,属于事务级数据缓冲。一旦事务结束,缓存随之失效。一个 Session 的生命周期对应一个数据库事务或一个程序事务。(2)Session-Cache 总是被打开并且不能被关闭的。session范围内减少数据库的访问次数! 只在session范围有效! Session关闭,一级缓存失效!
(3)Session-Cache 保证一个 Session 中两次请求同一个对象时,取得的对象是同一个 Java 实例,有时它可以避免不必要的数据冲突。
a.在对于同一个对象进行循环引用时,不至于产生堆栈溢出。b.当数据库事务结束时,对于同一数据表行,不会产生数据冲突。因为对于数据库中的一行,最多有一个对象来表示。c.一个事务中可能会有很多个处理单元,在每一个处理单元中做的操作都会立即被其他的数据单元得知。
Hibernate 二级缓存(SessionFactory 的缓存):
(1)二级缓存是 SessionFactory 范围内的缓存,所有的 Session 共享同一个二级缓存。在二级缓存中保存持久化实例的散装形式的数据。(2)持久化不同的数据需要不同的 Cache 策略,比如一些因素将影响 Cache 策略的选择:数据的读/写比例、数据表是否能被其他的应用程序所访问等。(3)设置 Hibernate 二级缓存需要分两步:首先,确认使用什么数据并发策略。然后,配置缓存过期时间并设置 Cache提供器。
6.如何优化Hibernate?
- Ø 数据库设计调整
- Ø HQL优化
- Ø API的正确使用(如根据不同的业务类型选用不同的集合及查询API)
- Ø 主配置参数(日志,查询缓存,fetch_size, batch_size等)
- Ø 映射文件优化(ID生成策略,二级缓存,延迟加载,关联优化)
- Ø 一级缓存的管理
- Ø 针对二级缓存,还有许多特有的策略
7.JDBC hibernate 和 ibatis 的区别
jdbc:手动
- 手动写sql
- delete、insert、update要将对象的值一个一个取出传到sql中,不能直接传入一个对象。
- select:返回的是一个resultset,要从ResultSet中一行一行、一个字段一个字段的取出,然后封装到一个对象中,不直接返回一个对象。
ibatis的特点:半自动化
- sql要手动写
- delete、insert、update:直接传入一个对象
- select:直接返回一个对象
hibernate:全自动
- 不写sql,自动封装
- delete、insert、update:直接传入一个对象
- select:直接返回一个对象
8.什么是SessionFactory, 是线程安全吗?
SessionFactory 是Hibrenate单例数据存储和线程安全的,以至于可以多线程同时访问。一个SessionFactory 在启动的时候只能建立一次。SessionFactory应该包装各种单例以至于它能很简单的在一个应用代码中储存.
9.get和load区别
1)get如果没有找到会返回null, load如果没有找到会抛出异常。
2)get会先查一级缓存, 再查二级缓存,然后查数据库;load会先查一级缓存,如果没有找到,就创建代理对象, 等需要的时候去查询二级缓存和数据库。
10.Hibernate 和 Mybatis 的区别。
两者相同点:
1)Hibernate 与 MyBatis 都可以是通过 SessionFactoryBuider 由 XML 配置文件生成 SessionFactory,然后由SessionFactory 生成 Session,最后由 Session 来开启执行事务和 SQL 语句。其中 SessionFactoryBuider,SessionFactory,Session 的生命周期都是差不多的。2)Hibernate 和 MyBatis 都支持 JDBC 和 JTA 事务处理。
Mybatis 优势:
1)MyBatis 可以进行更为细致的 SQL 优化,可以减少查询字段。2)MyBatis 容易掌握,而 Hibernate 门槛较高。
Hibernate 优势:
1)Hibernate 的 DAO 层开发比 MyBatis 简单,Mybatis 需要维护 SQL 和结果映射。2)Hibernate 对对象的维护和缓存要比 MyBatis 好,对增删改查的对象的维护要方便。3)Hibernate 数据库移植性很好,MyBatis 的数据库移植性不好,不同的数据库需要写不同 SQL。4)Hibernate 有更好的二级缓存机制,可以使用第三方缓存。MyBatis 本身提供的缓存机制不佳。
不同点:
JDBC 是 SUN 公司提供一套操作数据库的规范,使用 java 代码操作数据库。Hibernate 是一个基于 jdbc 的主流持久化框架,对 JDBC 访问数据库的代码做了封装。使用的 SQL 语言不同:JDBC 使用的是基于关系型数据库的标准 SQL 语言,Hibernate 使用的是 HQL(Hibernate 
query language)语言。操作的对象不同:JDBC 操作的是数据,将数据通过 SQL 语句直接传送到数据库中执行,Hibernate 操作的是持久化对象,由底层持久化对象的数据更新到数据库中。数据状态不同:JDBC 操作的数据是“瞬时”的,变量的值无法与数据库中的值保持一致,而 Hibernate 操作的数据是可持久的,即持久化对象的数据属性的值是可以跟数据库中的值保持一致。
11.Hibernate 的 orm 思想
ORM 指的是对象关系型映射(Object RelationShip Mapping ),指的就是我们通过创建实体类对象和数据库中的表关系进行一一对应,来实现通过操作实体类对象来更改数据库里边的数据信息。这里边起到关键作用的是通过Hibernate 的映射文件+Hibernate 的核心配置文件。
12.什么是 Hibernate 延迟加载?
延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在 Hibernate 中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在 Hibernate3 中还提供了对属性的延迟加载。
延迟加载的过程:通过代理(Proxy)机制来实现延迟加载。Hibernate 从数据库获取某一个对象数据时、获取某一个对象的集合属性值时,或获取某一个对象所关联的另一个对象时,由于没有使用该对象的数据(除标识符外),Hibernate 并不从数据库加载真正的数据,而只是为该对象创建一个代理对象来代表这个对象,这个对象上的所有属性都为默认值;只有在真正需要使用该对象的数据时才创建这个真正的对象,真正从数据库中加载它的数据。
13.简述 Session 的特点有哪些
(1)不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个 Session 实例。
(2)Session 实例是轻量级的,所谓轻量级是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建或销毁 Session 对象,例如为每个客户请求分配单独的 Session 实例,或者为每个工作单元分配单独的 Session实例。
(3)在 Session 中,每个数据库操作都是在一个事务(transaction)中进行的,这样就可以隔离开不同的操作(甚至包括只读操作)。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号