论Hibernate中delete方法及对象状态的特殊转变
delete和对象的状态
delete
概念:
delete,顾名思义,是对数据库记录进行删除的操作,它在hibernate中是如何运作的呢?这是我们接下来需要探讨的内容。
语法
通过Session对象调用该方法
session.delete(对象的引用);
执行delete
利用debug追踪和断点测试方法研究delete的执行过程
通过设置断点,获取执行delete前,对象的状态及Session中的缓存情况
get方法加载数据,发送sql语句
很明显,临时集合为空,数据存入到了map中
同样,User对象的属性根据数据库对应表中的记录得到了初始化。
在了解了对象的状态后,我们将断点下移,调用delete方法:
User对象中的值并未发生改变
map也没有发生变化
我们发现,在临时集合的deletion中存放了对象的所有数据
接着,我们继续讲断点下移,执行commit操作:
查询执行日志
通过最后一行记录,我们看到Hibernate向数据库发送了sql语句(delete语句)
临时集合也已经被清空
map同样被清空了,说明此事User对象没有纳入Session的管理,且执行了sql语句后,数据库中也没有与User对象对应的记录,我们可以断定:此时User进入了瞬时态。
那么如果找不到需要删除的记录的id怎么办呢?我们将id设为空串:
运行并查看运行结果
出现了IllegalArgumentException异常
结论:
调用delete方法:
- 将目标类放入临时集合中的deletion中;
- 执行commit方法,一旦deletion不为空,Hibernate通过deletion发送sql语句,如果找不到记录则会抛出异常;
- 清空临时集合和session缓存map中的目标类对象;
- User对象进入瞬时态。
对象的状态
创建对象直接进入持久态
如:get、load方法
通过此类方法创建的对象,一经创建立即纳入了Session管理,与数据库产生关联。
此时,对象处于持久态。
创建对象直接进入离线态
此类创建方法是一种特例:
通过new创建对象,并将对象中的主键设成数据库中已存在的主键,对象没有纳入Session管理,也和数据库没有关联,但数据库中存在和对象对应的记录(数据库中不同的记录是通过主键识别的)。
此时,该对象的状态不是瞬时态而是直接进入离线态。
说明:本文仅用作学习笔记,无其他用途,如有冒犯可联系本人删除