Hibernate实体对象四大状态

本文详细介绍了Hibernate中实体对象的四大状态:瞬时态、持久态、脱管态和删除态,以及它们之间的转换。通过状态图解、完整示例和源码分析,阐述了状态的区别,特别是瞬时态与脱管态的判断标准,并讨论了持久化操作如persist、save、update等的适用场景。
摘要由CSDN通过智能技术生成

首先声明,在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实体对象四大状态。

1. H

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值