PassivatedEntity


注意:PersistenceContext未确切了解,是否是每个钝化对象对应一个,是否是跟线程Contexts有关.
应该是跟线程Contexts关联,因为可能有多个数据源

package org.jboss.seam.contexts;

import java.io.Serializable;

import javax.persistence.EntityManager;

import org.hibernate.Session;
import org.jboss.seam.Component;
import org.jboss.seam.Seam;
import org.jboss.seam.persistence.HibernatePersistenceProvider;
import org.jboss.seam.persistence.PersistenceContexts;
import org.jboss.seam.persistence.PersistenceProvider;
import org.jboss.seam.transaction.Transaction;

/**
* A swizzled entity reference, consisting of the class,
* id and persistence context name.
*
* @see EntityBean
* @see org.jboss.seam.persistence.ManagedEntityInterceptor
*
* @author Gavin King
*
*/
class PassivatedEntity implements Serializable
{
private static final long serialVersionUID = 6565440294007267788L;

private Object id;
private Object version;
private String persistenceContext;
private Class<?> entityClass; //TODO: make this transient, and serialize only the class name..

private PassivatedEntity(Object id, Object version, Class<?> entityClass, String persistenceContext)
{
this.id = id;
this.persistenceContext = persistenceContext;
this.entityClass = entityClass;
this.version = version;
}

private String getPersistenceContext()
{
return persistenceContext;
}

private Object getId()
{
return id;
}

private Class<?> getEntityClass()
{
return entityClass;
}

public boolean isVersioned()
{
return version!=null;
}
/**
* 根据保存ID version class从数据库中获取Object 激活
*/
public Object toEntityReference(boolean checkVersion)
{
Object persistenceContext = Component.getInstance( getPersistenceContext() );
if ( persistenceContext==null )
{
return null;
}
else
{
if (persistenceContext instanceof EntityManager)
{
return getEntityFromEntityManager(persistenceContext, checkVersion);
}
else
{
return getEntityFromHibernate(persistenceContext, checkVersion);
}
}
}

private Object getEntityFromHibernate(Object persistenceContext, boolean checkVersion)
{
//TODO: split this out to somewhere to isolate the Hibernate dependency!!
Session session = (Session) persistenceContext;
if ( session.isOpen() )
{
Object result = session.load( getEntityClass(), (Serializable) getId() );
if (result!=null && checkVersion)
{
checkVersion(session, result);
}
return result;
}
else
{
return null;
}
}

private void checkVersion(Session session, Object result)
{
Object version = HibernatePersistenceProvider.getVersion(result, session);
if (version!=null)
{
HibernatePersistenceProvider.checkVersion(result, session, this.version, version);
}
}

private Object getEntityFromEntityManager(Object persistenceContext, boolean checkVersion)
{
EntityManager em = (EntityManager) persistenceContext;
if ( em.isOpen() )
{
Object result = em.getReference( getEntityClass(), getId() ); //从EM中getReference
if (result!=null && checkVersion)
{
checkVersion(em, result); //check version is ok
}
return result;
}
else
{
return null;
}
}

private void checkVersion(EntityManager em, Object result)
{
Object version = PersistenceProvider.instance().getVersion(result, em);
if (version!=null)
{
PersistenceProvider.instance().checkVersion(result, em, this.version, version); //check version
}
}

/*public static Object unpassivateEntityAndCheckVersion(String key)
{
return unpassivateEntity(key, true);
}

public static Object unpassivateEntity(String key)
{
return unpassivateEntity(key, false);
}

private static Object unpassivateEntity(String key, boolean checkVersion)
{
PassivatedEntity passivatedEntity = (PassivatedEntity) Contexts.getConversationContext().get(key);
return passivatedEntity==null ? null : passivatedEntity.toEntityReference(checkVersion);
}*/
/**
* 钝化一个实体,判断是否是Entity
* 1.获取一个持久化上下文EntityManager
* 2.判断是使用Native HIbernate还是JPA
* 3.判断实体是否受管
* 4.获取Entity id version class persistenceContextName
* 5.创建钝化实体
*/
public static PassivatedEntity passivateEntity(Object value)
{
Class entityClass = Seam.getEntityClass( value.getClass() );//检测是否是实体,包括EJB,如果不是则返回null
if (entityClass!=null)
{
for ( String persistenceContextName: PersistenceContexts.instance().getTouchedContexts() )
{
Object persistenceContext = Component.getInstance(persistenceContextName);
return createPassivatedEntity(value, entityClass, persistenceContextName, persistenceContext);
}
}
return null;
}

private static PassivatedEntity createPassivatedEntity(Object value, Class entityClass, String persistenceContextName, Object persistenceContext)
{
if (persistenceContext instanceof EntityManager)
{
return createUsingEntityManager(value, entityClass, persistenceContextName, persistenceContext);
}
else
{
return createUsingHibernate(value, entityClass, persistenceContextName, persistenceContext);
}
}

/*private static String storeConversationContext(PassivatedEntity result)
{
if (result==null)
{
return null;
}
else
{
String key = result.getKey();
Contexts.getConversationContext().set( key, result );
return key;
}
}

private String getKey()
{
return "org.jboss.seam.passivatedEntity." + entityClass.getName() + '#' + getId();
}*/

private static PassivatedEntity createUsingHibernate(Object value, Class entityClass, String persistenceContextName, Object persistenceContext)
{
//TODO: split this out to somewhere to isolate the Hibernate dependency!!
Session session = (Session) persistenceContext;
if ( isManaged(value, session) )
{
Object id = session.getIdentifier(value);
Object version = HibernatePersistenceProvider.getVersion(value, session);
return create(entityClass, persistenceContextName, id, version);
}
else
{
return null;
}
}

private static boolean isManaged(Object value, Session session)
{
boolean managed;
try
{
managed = session.isOpen() && session.contains(value);
}
catch (RuntimeException re)
{
//just in case! //TODO; deleteme
managed = false;
}
return managed;
}

private static PassivatedEntity createUsingEntityManager(Object value, Class entityClass, String persistenceContextName, Object persistenceContext)
{
EntityManager em = (EntityManager) persistenceContext;
if ( isManaged(value, em) )
{
Object id = PersistenceProvider.instance().getId(value, em); //获取Entity的ID
Object version = PersistenceProvider.instance().getVersion(value, em);//版本,version可能为null
return create(entityClass, persistenceContextName, id, version);
}
else
{
return null;
}
}
/**
* EM is open or EMC contains this object
*/
private static boolean isManaged(Object value, EntityManager em)
{
boolean managed;
try
{
managed = em.isOpen() && em.contains(value);
}
catch (RuntimeException re)
{
//workaround for bug in HEM! //TODO; deleteme
managed = false;
}
return managed;
}

private static PassivatedEntity create(Class entityClass, String persistenceContextName, Object id, Object version)
{
if (id==null)
{
//this can happen if persist() fails in Hibernate
return null;
}
else
{
return new PassivatedEntity(id, version, entityClass, persistenceContextName);
}
}

static boolean isTransactionRolledBackOrMarkedRollback()
{
try
{
return Transaction.instance().isRolledBackOrMarkedRollback();
}
catch (Exception e)
{
return false;
}
}

@Override
public String toString()
{
return entityClass + "#" + id;
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值