[jboss-cvs] jboss-seam/src/main/org/jboss/seam/contexts ...
Gavin King
gavin.king at jboss.com
Mon Jun 18 01:57:35 EDT 2007
User: gavin
Date: 07/06/18 01:57:35
Modified: src/main/org/jboss/seam/contexts PassivatedEntity.java
Log:
JBSEAM-942, optimistic locking for passivated entities
Revision Changes Path
1.11 +52 -9 jboss-seam/src/main/org/jboss/seam/contexts/PassivatedEntity.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: PassivatedEntity.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/contexts/PassivatedEntity.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- PassivatedEntity.java 16 Jun 2007 16:30:13 -0000 1.10
+++ PassivatedEntity.java 18 Jun 2007 05:57:35 -0000 1.11
@@ -3,8 +3,11 @@
import java.io.Serializable;
import javax.persistence.EntityManager;
+import javax.persistence.OptimisticLockException;
+import org.hibernate.EntityMode;
import org.hibernate.Session;
+import org.hibernate.metadata.ClassMetadata;
import org.jboss.seam.Component;
import org.jboss.seam.Seam;
import org.jboss.seam.core.PersistenceContexts;
@@ -26,14 +29,16 @@
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, Class<?> entityClass, String persistenceContext)
+ private PassivatedEntity(Object id, Object version, Class<?> entityClass, String persistenceContext)
{
this.id = id;
this.persistenceContext = persistenceContext;
this.entityClass = entityClass;
+ this.version = version;
}
public String getPersistenceContext()
@@ -60,18 +65,38 @@
}
else
{
+ Object result = null;
+ Object version = null;
if (persistenceContext instanceof EntityManager)
{
EntityManager em = (EntityManager) persistenceContext;
- return em.isOpen() ?
- em.getReference( getEntityClass(), getId() ) : null;
+ if ( em.isOpen() )
+ {
+ result = em.getReference( getEntityClass(), getId() );
+ if (result!=null)
+ {
+ version = PersistenceProvider.instance().getVersion(result, em);
+ }
+ }
}
else
{
+ //TODO: split this out to somewhere to isolate the Hibernate dependency!!
Session session = (Session) persistenceContext;
- return session.isOpen() ?
- session.load( getEntityClass(), (Serializable) getId() ) : null;
+ if ( session.isOpen() )
+ {
+ result = session.load( getEntityClass(), (Serializable) getId() );
+ if (result!=null)
+ {
+ version = getVersion(result, session);
+ }
+ }
+ }
+ if ( result!=null && this.version!=null && !this.version.equals(version) )
+ {
+ throw new OptimisticLockException("current database version number does not match passivated version number");
}
+ return result;
}
}
@@ -84,7 +109,8 @@
{
Object persistenceContext = Component.getInstance(persistenceContextName);
boolean managed;
- Object id;
+ Object id = null;
+ Object version = null;
if (persistenceContext instanceof EntityManager)
{
EntityManager em = (EntityManager) persistenceContext;
@@ -97,10 +123,15 @@
//workaround for bug in HEM! //TODO; deleteme
managed = false;
}
- id = managed ? PersistenceProvider.instance().getId(value, em) : null;
+ if (managed)
+ {
+ id = PersistenceProvider.instance().getId(value, em);
+ version = PersistenceProvider.instance().getVersion(value, em);
+ }
}
else
{
+ //TODO: split this out to somewhere to isolate the Hibernate dependency!!
Session session = (Session) persistenceContext;
try
{
@@ -111,7 +142,11 @@
//just in case! //TODO; deleteme
managed = false;
}
- id = managed ? session.getIdentifier(value) : null;
+ if (managed)
+ {
+ id = session.getIdentifier(value);
+ version = getVersion(value, session);
+ }
}
if (managed)
{
@@ -122,7 +157,7 @@
}
else
{
- return new PassivatedEntity(id, entityClass, persistenceContextName);
+ return new PassivatedEntity(id, version, entityClass, persistenceContextName);
}
}
}
@@ -130,6 +165,14 @@
return null;
}
+ private static Object getVersion(Object value, Session session)
+ {
+ ClassMetadata classMetadata = session.getSessionFactory()
+ .getClassMetadata( value.getClass() );
+ return classMetadata.isVersioned() ?
+ classMetadata.getVersion(value, EntityMode.POJO) : null;
+ }
+
public static boolean isTransactionRolledBackOrMarkedRollback()
{
try
More information about the jboss-cvs-commits
mailing list