请看进行了如下总结:
一、在session的内部缓存中寻找保存对象,如果找到了,则认为此数据已经保存(曾经执行过insert操作),实体对象已经处于 persistent状态,直接返回。此时即使数据相比之前的状态发生了变化,也将在事务提交时由脏数据检查来判定是否需要执行update操作。
二、如果实体对象实现了lifecycle接口,那么将执行待保存对象的onSave()方法。
三、如果实体对象实现了Validatable接口,那么将会执行相应的validate()方法。
四、如果存在拦截器对象,那么将会执行Interceptor.onSave()方法。
五、构造insert SQL语句完成数据保存。
六、数据保存成功后,设定实体对象的id为插入记录的id。
七、将保存后的实体对象纳入Hibernate的内部缓存(一级缓存)。注意Hibernate不会把保存后的实体对象纳入二级缓存,因为刚刚保存过的实体对象很可能在之后被修改,缓存的频繁更新以及带来的同步问题代价,超出了缓存该对象所带来的收益。
八、如果关联关系映射配置了cascade="save-update"属性,save操作对关联对象级联操作。
上图:
序列图: