[jboss-cvs] jboss-seam/src/main/org/jboss/seam/persistence ...
Gavin King
gavin.king at jboss.com
Mon Jun 18 16:38:22 EDT 2007
User: gavin
Date: 07/06/18 16:38:22
Modified: src/main/org/jboss/seam/persistence
HibernatePersistenceProvider.java
PersistenceProvider.java
Log:
JBSEAM-1489
Revision Changes Path
1.12 +29 -8 jboss-seam/src/main/org/jboss/seam/persistence/HibernatePersistenceProvider.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: HibernatePersistenceProvider.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/persistence/HibernatePersistenceProvider.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- HibernatePersistenceProvider.java 18 Jun 2007 15:53:55 -0000 1.11
+++ HibernatePersistenceProvider.java 18 Jun 2007 20:38:22 -0000 1.12
@@ -10,7 +10,9 @@
import org.hibernate.EntityMode;
import org.hibernate.FlushMode;
import org.hibernate.Session;
+import org.hibernate.StaleStateException;
import org.hibernate.metadata.ClassMetadata;
+import org.hibernate.type.VersionType;
import org.jboss.seam.InterceptionType;
import org.jboss.seam.ScopeType;
import org.jboss.seam.Seam;
@@ -62,6 +64,12 @@
}
@Override
+ public void checkVersion(Object bean, EntityManager entityManager, Object oldVersion, Object version)
+ {
+ checkVersion(bean, getSession(entityManager), oldVersion, version);
+ }
+
+ @Override
public void enableFilter(Filter f, EntityManager entityManager)
{
org.hibernate.Filter filter = getSession(entityManager).enableFilter( f.getName() );
@@ -90,16 +98,30 @@
return (Session) entityManager.getDelegate();
}
- public static Object getVersion(Object value, Session session)
+ public static void checkVersion(Object value, Session session, Object oldVersion, Object version)
{
- Class entityClass = Seam.getEntityClass( value.getClass() );
- if (entityClass==null)
+ ClassMetadata classMetadata = getClassMetadata(value, session);
+ VersionType versionType = (VersionType) classMetadata.getPropertyTypes()[ classMetadata.getVersionProperty() ];
+ if ( !versionType.isEqual(oldVersion, version) )
+ {
+ throw new StaleStateException("current database version number does not match passivated version number");
+ }
+ }
+
+ public static Object getVersion(Object value, Session session)
{
- return null;
+ ClassMetadata classMetadata = getClassMetadata(value, session);
+ return classMetadata!=null && classMetadata.isVersioned() ?
+ classMetadata.getVersion(value, EntityMode.POJO) : null;
}
- else
+
+ private static ClassMetadata getClassMetadata(Object value, Session session)
+ {
+ Class entityClass = Seam.getEntityClass( value.getClass() );
+ ClassMetadata classMetadata = null;
+ if (entityClass!=null)
{
- ClassMetadata classMetadata = session.getSessionFactory().getClassMetadata(entityClass);
+ classMetadata = session.getSessionFactory().getClassMetadata(entityClass);
if (classMetadata==null)
{
throw new IllegalArgumentException(
@@ -107,9 +129,8 @@
entityClass.getName()
);
}
- return classMetadata.isVersioned() ?
- classMetadata.getVersion(value, EntityMode.POJO) : null;
}
+ return classMetadata;
}
}
1.13 +20 -0 jboss-seam/src/main/org/jboss/seam/persistence/PersistenceProvider.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: PersistenceProvider.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/persistence/PersistenceProvider.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- PersistenceProvider.java 18 Jun 2007 05:57:35 -0000 1.12
+++ PersistenceProvider.java 18 Jun 2007 20:38:22 -0000 1.13
@@ -2,7 +2,10 @@
import static org.jboss.seam.annotations.Install.BUILT_IN;
+import java.util.Date;
+
import javax.persistence.EntityManager;
+import javax.persistence.OptimisticLockException;
import javax.transaction.Synchronization;
import org.jboss.seam.Component;
@@ -74,6 +77,23 @@
return Entity.forClass( bean.getClass() ).getVersion(bean);
}
+ public void checkVersion(Object bean, EntityManager entityManager, Object oldVersion, Object version)
+ {
+ boolean equal;
+ if (oldVersion instanceof Date)
+ {
+ equal = ( (Date) oldVersion ).getTime() == ( (Date) version ).getTime();
+ }
+ else
+ {
+ equal = oldVersion.equals(version);
+ }
+ if ( !equal )
+ {
+ throw new OptimisticLockException("current database version number does not match passivated version number");
+ }
+ }
+
/**
* Enable a Filter. This is here just especially for Hibernate,
* since we well know that other products don't have such cool
More information about the jboss-cvs-commits
mailing list