Hibernate笔记

Posted 技术新高度

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate笔记相关的知识,希望对你有一定的参考价值。

hibernate中的两种文件:

1.配置文件 hibernate.cfg.xml
   文件中包括:
     1.连接数据库的相关信息
     2.hibernate框架本身的一些属性设置
     3.对实体类进行映射的映射文件路径
  这文件的名字默认是叫hibernate.cfg.xml,默认存放的文件就是直接放在src下面,这样的好处就是,将来hibernate会自动的去读取src下面的一个叫做hibernate.cfg.xml的文件。
  我们是可以修改名字和路径的,只不过修改完之后要把新的名字和路径传给hibernate才行。

2.映射文件 xxx.hbm.xml
   作用:对实体类进行映射.
   其实就是描述类和数据库中表的映射关系.
   <id>标签对主键映射的描述
   <property>标签对其他属性映射的描述
   
   这个文件的名字一般会叫做xxx.hbm.xml,xxx就是这个文件所要映射的那个类的名字,
   这个文件的位置一般会放在和文件所映射的类相同的位置。



org.hibernate.cfg.Configuration类
作用:
  1.读取配置文件hibernate.cfg.xml
  2.创建SessionFactory对象


org.hibernate.SessionFactory接口
作用:
  产生Session接口的实现类对象

只有Configuration类对象读取了正确配置的hibernate.cfg.xml文件之后,才能创建出SessionFactory接口的实现类对象.

注意:hibernate.cfg.xml文件中包含了映射文件的路径,所以,映射文件中的内容也必须配置正确,
否则SessionFactory接口的实现类对象还是创建不出来.

SessionFactory接口的实现类对象,在一个使用hibernate框架的项目中,只需要有一个这样的对象就可以.


org.hibernate.Session接口
作用:
  完成代码和数据库之间的交互.
 
  hibernate中,如果没有session对象,那么任何数据库的操作都做不了.


org.hibernate.Transaction接口
作用:
  一个Transaction类型对象代表着一个事务.

在使用session进行操作数据之前,要先开启一个事务.


hibernate中把实体类对象分为三种:

transient   自由状态/瞬态

detached    游离状态/脱管状态

persistent  持久化状态


hibernate中锁机制分为乐观锁和悲观锁

悲观锁:hibernate是利用了数据库里面的锁机制来完成的,比如oracle中sql语句里面的for update和for update nowait来实现的。
select * from teacher where id=1 for update
select * from teacher where id=1 for update nowait

乐观锁:依靠hibernate中的一些设置和配置来完成的.



hibernate中的锁机制:

如果在hibernate中把事务隔离级别设置为serializable,那么我们就完全没有必要使用hibernate中的锁机制了,
但是这样设置后事务的执行效率很低,所有我们一般会设置为read-committed,这样既能解决脏读又有一定的效率,只是在
这种设置下仍然会有不可重复读的问题(幻读不考虑,很少出现),所有我们在hibernate就可以使用锁机制来解决这个问题.



isolation  事务隔离级别

 read-uncommitted  不提交也能读
 read-committed    提交之后才能读 解决了脏读
 repeatable-read   解决了脏读和不可重复读
 serializable      三个问题都解决了

 级别越高解决的问题越多但是效率越低。
 注意:并不是所有数据库都支持这四种事务隔离级别,比如oracle就只支持第二种和第四种这俩种,比如mysql就四种全支持.
 
 oracle里面默认的事务隔离级别是第二种:read-committed

事务以及事务所引发的问题

1.脏读  主要针对update操作。 一个事务A读到另一个事务B中修改过但是还没有提交的数据

2.不可重复读  主要针对update操作。 一个事务A在第一次读数据和第二次读数据之间,有另一个事务B把这个数据更改并提交了,所有就出现了
事务A里面读一个数据俩次,但是读到的结果是不同的。

3.幻读  主要针对的是insert/delete操作。事务A第一次用where条件筛选出了10条数据,事务A第二次用通样的where
条件筛选出的却是11条数据,因为事务B在事务A的第一次和第二次查询直接进行了插入操作,并且插入的这个数据满足事务A的where筛选条件.






hibernate中的缓存:

一级缓存: Session级别的缓存
二级缓存: SessionFactory级别的缓存
   1.默认情况情况下二级缓存是不能使用的。
   2.需要一些相应的配置之后才能开启二级缓存

查询缓存: 针对hql语句查询(Criteria)
   1.查询缓存默认是关闭的
   2.使用查询缓存需要hibernate.cfg.xml中做配置
    <property name="cache.use_query_cache">true</property>
   3.查询缓存依赖于二级缓存
   4.在代码里面,使用query进行查询之前,同时需要设置一下使用查询缓存:
          query.setCacheable(true).list();




配置二级缓存:
1.把需要的俩个jar导入到当前项目里面
    commons-logging.jar
    ehcache-1.2.3.jar
2.把ehcache.xml直接复制粘贴到src下面

3.在hibernate.cfg.xml中配置使用二级缓存
    <property name="cache.use_second_level_cache">true</property>

4.在hibernate.cfg.xml中配置出实现了二级缓存的提供者
    <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
    
5.配置ehcache.xml文件,如果不配置,使用里默认的配置也是可以的.


6.在某个类的映射文件中配置,指明这个类的对象将来是可以放进二级缓存里面的.
    <cache usage="read-write"/>


















































































































































以上是关于Hibernate笔记的主要内容,如果未能解决你的问题,请参考以下文章

hibernate-笔记

Hibernate学习笔记---hibernate核心文件

hibernate笔记

hibernate中错误笔记

hibernate笔记--组件映射方法

Hibernate框架学习笔记