java踩雷系列4-Hibernate(1) 一些概念和注意的问题

什么是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 ,可能是其他方法
可以检查一下这些语句之前有没有开启事物,要将这些放在事物内

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值