论Hibernate中delete方法及对象状态的特殊转变

delete

概念:

delete,顾名思义,是对数据库记录进行删除的操作,它在hibernate中是如何运作的呢?这是我们接下来需要探讨的内容。

语法

通过Session对象调用该方法
session.delete(对象的引用);

执行delete

利用debug追踪和断点测试方法研究delete的执行过程
论Hibernate中delete方法及对象状态的特殊转变
通过设置断点,获取执行delete前,对象的状态及Session中的缓存情况

论Hibernate中delete方法及对象状态的特殊转变

get方法加载数据,发送sql语句

论Hibernate中delete方法及对象状态的特殊转变
很明显,临时集合为空,数据存入到了map中
论Hibernate中delete方法及对象状态的特殊转变

同样,User对象的属性根据数据库对应表中的记录得到了初始化。

在了解了对象的状态后,我们将断点下移,调用delete方法:

论Hibernate中delete方法及对象状态的特殊转变
User对象中的值并未发生改变

论Hibernate中delete方法及对象状态的特殊转变
map也没有发生变化

论Hibernate中delete方法及对象状态的特殊转变
我们发现,在临时集合的deletion中存放了对象的所有数据

接着,我们继续讲断点下移,执行commit操作:

论Hibernate中delete方法及对象状态的特殊转变

查询执行日志

论Hibernate中delete方法及对象状态的特殊转变
通过最后一行记录,我们看到Hibernate向数据库发送了sql语句(delete语句)

论Hibernate中delete方法及对象状态的特殊转变
临时集合也已经被清空

论Hibernate中delete方法及对象状态的特殊转变
map同样被清空了,说明此事User对象没有纳入Session的管理,且执行了sql语句后,数据库中也没有与User对象对应的记录,我们可以断定:此时User进入了瞬时态

那么如果找不到需要删除的记录的id怎么办呢?我们将id设为空串:

论Hibernate中delete方法及对象状态的特殊转变

运行并查看运行结果

论Hibernate中delete方法及对象状态的特殊转变
出现了IllegalArgumentException异常

结论:

调用delete方法:

  1. 将目标类放入临时集合中的deletion中;
  2. 执行commit方法,一旦deletion不为空,Hibernate通过deletion发送sql语句,如果找不到记录则会抛出异常;
  3. 清空临时集合和session缓存map中的目标类对象;
  4. User对象进入瞬时态

对象的状态

创建对象直接进入持久态

如:get、load方法
通过此类方法创建的对象,一经创建立即纳入了Session管理,与数据库产生关联。
此时,对象处于持久态。

创建对象直接进入离线态

此类创建方法是一种特例:
通过new创建对象,并将对象中的主键设成数据库中已存在的主键,对象没有纳入Session管理,也和数据库没有关联,但数据库中存在和对象对应的记录(数据库中不同的记录是通过主键识别的)。
此时,该对象的状态不是瞬时态而是直接进入离线态。

说明:本文仅用作学习笔记,无其他用途,如有冒犯可联系本人删除