首先声明,在Hibernate中,实体对象存在四种状态,而不是三种(见org.hibernate.event.def.AbstractSaveEventListener)。
网上流传的hibernate对象三大状态,大概是因为hibernate官方文档没有更新,一个人写了之后,一个接着一个的copy吧,你懂的。
状态常量
/**
* 持久态
*/
protected static final int PERSISTENT = 0;
/**
* 瞬时态
*/
protected static final int TRANSIENT = 1;
/**
* 游离态
*/
protected static final int DETACHED = 2;
/**
* 删除态
*/
protected static final int DELETED = 3;
获取实体状态方法
protected int getEntityState(Object entity, String entityName, EntityEntry entry, SessionImplementor source) {
if (entry != null) {
/**
* the object is persistent
* the entity is associated with the session, so check its status
*/
if (entry.getStatus() != Status.DELETED) {
/**
* do nothing for persistent instances
*/
if (log.isTraceEnabled()) {
log.trace("persistent instance of: " + getLoggableName(entityName, entity));
}
return PERSISTENT;
} else {
/**
* ie. e.status==DELETED
*/
if (log.isTraceEnabled()) {
log.trace("deleted instance of: " + getLoggableName(entityName, entity));
}
return DELETED;
}
} else {
/**
* the object is transient or detached
* the entity is not associated with the session, so try interceptor and unsaved-value
*/
if (ForeignKeys.isTransient(entityName, entity, getAssumedUnsaved(), source)) {
if (log.isTraceEnabled()) {
log.trace("transient instance of: " + getLoggableName(entityName, entity));
}
return TRANSIENT;
} else {
if (log.isTraceEnabled()) {
log.trace("detached instance of: " + getLoggableName(entityName, entity));
}
return DETACHED;
}
}
}
接下来将结合源码,分析Hibernate实体对象四大状态。