什么是Hibernate?
Hibernate主要是对jdbc进行封装,通过xml进行表和对象的映射,数据库的配置(也可通过代码实现但是比较繁琐),让我们对数据库的增删改查可以通过操纵对象实现,除了一些提供的方法之外,Hibernate有固定的语法(hql),兼容多种数据库,同时也支持原生sql语句
几个概念:
ORM:
object -Relational -Mapping
对象 -关系 -映射
三种状态:
瞬时状态 (Transient)
持久状态 (Persistent)
脱管状态 (Detached)
如何理解:
瞬时:对象new 的时候,和hibernate八竿子打不着的关系
持久:
在session.save进行保存或更新的对象
在Query.list(),等查询之后得到的对象
即总的来说是在 Hibernate缓存管理时的状态
持久对象总是与 Session 和 Transaction 相关联,在一个 Session 中,对持久对象的改变不会马上对数据库进行变更,而必须在 Transaction 终止,也就是执行 commit() 之后,才在数据库中真正运行 SQL 进行变更,持久对象的状态才会与数据库进行同步。在同步之前的持久对象称为脏 (dirty) 对象。
脱管:在持久状态结束之后就是脱管状态,和瞬时没啥区别,最终要么转化为持久状态或者被回收
二级缓存和一级缓存:
一级:Session级,随着session的关闭而释放
二级:SessionFactory级,需要配置,默认关闭
什么时候用到了一级缓存:
get,load:通过主键id获取某个对象
get,load区别:
get当找不到id时返回的null,而load会报错
get是即时加载,load是延迟加载
refresh:刷新一级缓存对象
save:保存
update:更新
list,uniqueResult可以返回多个对象,并写入一级缓存(而上面两个方法是只获取一个)
参考:https://blog.csdn.net/scaarf/article/details/71711487
hql:
类比sql,很多写法差不多,但是操作对象和sql不同,sql的是表,而hql是对象(类名)
事物:
事务就是指作为单个逻辑工作单元执行的一组数据操作,这些操作要么必须全部成功,要么必须全部失败,以保证数据的一致性和完整性。
四个特性:ACID
A:原子性
C:一致性
I:隔离性
D:持久性
参考链接:https://www.cnblogs.com/jerryxing/archive/2012/04/24/2468986.html
session.beginTransaction();
//事物中的操作
session.getTransaction().commit();
本地事务是指对一个数据库进行的操作,即只针对一个事务性资源进行操作;
而全局事务是指由应用服务器管理的事务,它需要使用 JTA(Java Transaction API),可以用于多个事务性资源(跨多个数据库)。
一般用的是本地事物
本地事物配置:
<property name="hibernate.current_session_context_class">thread</property>
全局事物配置:
<property name="hibernate.current_session_context_class">jta</property>
配置这个干什么用?
可以通过:sessionFactory.getCurrentSession();来获取Session
如无配置调用这个会报这个错: No CurrentSessionContext configured!
并且这样可以避免频繁的OpenSession,如果和数据库交互很频繁,还是这样做好一点
其他两个错误:
1.在多语句事务内不允许使用 ALTER DATABASE 语句
原因:当执行修改数据库的语句如:创建表,修改某个表字段之类时,这些语句是不能放在事物里的,这种情况建议单独OpenSession,不要和别的数据库操作共用同一个Session,另外如果两处OpenSession的时间间隔很短,可能这两个Session会是同一个,这样也会出现这种错误
2.createQuery is not valid without active transaction
前面不一定是createQuery ,可能是其他方法
可以检查一下这些语句之前有没有开启事物,要将这些放在事物内