4、persist
1) 返回值
void
2)事件监听处理类及重要代码
DefaultPersistEventListener
protected
void
entityIsTransient(PersistEvent event, Map createCache) {
LOG.trace(
"Saving transient instance"
);
final
EventSource source = event.getSession();
final
Object entity = source.getPersistenceContext().unproxy( event.getObject() );
if
( createCache.put( entity, entity ) ==
null
) {
saveWithGeneratedId( entity, event.getEntityName(), createCache, source,
false
);
}
}
3)事务范围外的处理方式
非立即执行
4) 瞬时态
如果在事务范围外,persist不会立即执行 insert sql,这是与save最大的区别;如果在事务范围内,
persist会立即执行 insert sql,但事务没有提交,所以数据库中没数据。
即使在事务范围外,即没有事务的情况下,save方法也会立即执行insert Sql;
如果
事务为
自动提交,
数据库中将有数据
。
5)
游离态
如果对
游离态
的(DETACHED)实体进行persist,会抛出异常。
org.hibernate.PersistentObjectException
: detached entity passed to persist: org.hibernate.tutorial.hbm.Event.
6)
持久态:实体对象本身不做任何动作。如果缓存中不存在持久态的实体,将会做一些级联操作。
5、merge
1) 返回值
object
2)事件监听处理类及重要代码
DefaultMergeEventListener
3)事务范围外的处理方式
非立即执行
4) 瞬时态
4.1)
如果在事务范围外,merge不会立即执行 insert sql,这是与save最大的区别;如果在事务范围内,
merge
会立即执行 insert sql,但事务没有提交,所以数据库中没数据。
即使在事务范围外,即没有事务的情况下,save方法也会立即执行insert Sql;
如果
事务为
自动提交,
数据库中将有数据
。
4.2) 同时多次merge同一个瞬时态的实体并提交事务,数据库中会相应的有多条记录。因为,merge操作只会将瞬时态original对象做一个copy,然后对copy对象进行数据库持久化操作,
所以original永远都是瞬时态;同理,多次merge同一个瞬时态对象,会执行多次insert操作。merge方法返回的对象才是被持久化的对象。
Event copyObj = (Event) session.merge(event); //original对象的状态不变,仍然是瞬时态,返回的对象才是被持久化的对象。
5)游离态
merge游离态对象时,会根据entity与id进行一次数据库查询,如果数据库中存在该实体对应的记录,会做一些收尾的辅助处理;如果不存在,则将该对象作为瞬时态进行处理。
final
Object result = source.get(entityName, clonedIdentifier);
6)持久态
不会进行数据库操作。
6、Replicate
1) 返回值
void
参数
(Object obj, ReplicationMode replicationMode)
2)事件监听处理类及重要代码
DefaultReplicateEventListener
2.1)Replicate方法与save、update、saveOrUpdate、merge和persist最大的区别是不区分实体
的
状态,即不区分是否为瞬时态、游离态和持久态;但多一个复制模式的参数。
2.2)ReplicationMode 分为EXCEPTION、IGNORE、OVERWRITE、LATEST_VERSION。
EXCEPTION不管数据库是否存在关键字值相等的记录,都要插入。
IGNORE表示存在,则不复制。
OVERWRITE,表示覆盖原来的。
LATEST_VERSION使用最新版本的。
2.3)如果根据关键字值,查找数据库中存在该条记录:
I) canReplicate为true,即允许更新该条记录到数据库中,则创建一个entity对应的EntityEntry并加入到StatefulPersistenceContext中,即将该实体标示为持久态。
等到flush(非显示事务且自动提交)时,或提交事务时,更新数据库。
II)
canReplicate为false,即不允许更新该条记录至数据库,则放弃直接返回,不做任何处理。
2.4)
只有在数据库中没有查询到关键字值对应的记录,replicate操作才会执行Insert sql,其他情况不执行操作。
I) 立即执行的情况,如果ID是由数据库而非代码生成(
SequenceGenerator、
IdentityGenerator、
SelectGenerator策略
),
useIdentityColumn被赋值为true,则会立即执行。
II) 不立即执行Insert Sql,
如果ID是由
代码
而非
数据库
生成(
SequenceGenerator、
IdentityGenerator、
SelectGenerator策略
),
useIdentityColumn被赋值为false,则不会立即执行。
3)事务范围外的处理方式
见2.4。
4)瞬时态
无。
5)持久态
无。
6)游离态
无。