Hibernate笔记
1、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就是这个文件所要映射的那个类的名字,
这个文件的位置一般会放在和文件所映射的类相同的位置。
2、Hibernate 重要接口
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进行操作数据之前,要先开启一个事务.
3、hibernate中的实体类对象
hibernate把实体类对象分为三种:
transient 自由状态/瞬态
detached 游离状态/脱管状态
persistent 持久化状态
4、hibernate中的锁机制:
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就可以使用锁机制来解决这个问题.
5、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筛选条件.
6、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"/>