Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Taal2012-11-27 15:48:30 +0000
committerMartin Taal2012-11-27 15:48:30 +0000
commit49eec08d08009bf508c6dddf2ba185a05d4a1931 (patch)
treeb5f21fc4f87f62936838553d6c4a24d4eca09ba9 /plugins/org.eclipse.emf.cdo.server.hibernate
parentadf1e145fb0b3a77e79b409e71750b5de37d5e8d (diff)
downloadcdo-49eec08d08009bf508c6dddf2ba185a05d4a1931.tar.gz
cdo-49eec08d08009bf508c6dddf2ba185a05d4a1931.tar.xz
cdo-49eec08d08009bf508c6dddf2ba185a05d4a1931.zip
Auditing: fix for misaligned version of updated objects
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server.hibernate')
-rw-r--r--plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStoreAccessor.java34
1 files changed, 24 insertions, 10 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStoreAccessor.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStoreAccessor.java
index 4c2529cb0e..9dc284c06c 100644
--- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStoreAccessor.java
+++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateStoreAccessor.java
@@ -96,6 +96,7 @@ import java.sql.Clob;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -856,6 +857,26 @@ public class HibernateStoreAccessor extends StoreAccessor implements IHibernateS
// decrement version, hibernate will increment it
decrementVersions(context);
+ // now check the versions and store the hibernate revision to repair
+ // versions later on. The versions can be updated when inserting new objects
+ // this will result in a version difference when the object gets merged
+ // this repair is done just before the merge
+ final Map<CDOID, InternalCDORevision> existingRevisions = new HashMap<CDOID, InternalCDORevision>();
+ for (InternalCDORevision revision : context.getDirtyObjects())
+ {
+ final String entityName = HibernateUtil.getInstance().getEntityName(revision.getID());
+ final Serializable idValue = HibernateUtil.getInstance().getIdValue(revision.getID());
+ final InternalCDORevision cdoRevision = (InternalCDORevision)session.get(entityName, idValue);
+ if (cdoRevision != null)
+ {
+ if (cdoRevision.getVersion() != revision.getVersion())
+ {
+ throw new IllegalStateException("Revision " + cdoRevision + " was already updated by another transaction");
+ }
+ existingRevisions.put(revision.getID(), cdoRevision);
+ }
+ }
+
// order is 1) insert, 2) update and then delete
// this order is the most stable! Do not change it without testing
@@ -885,17 +906,10 @@ public class HibernateStoreAccessor extends StoreAccessor implements IHibernateS
for (InternalCDORevision revision : context.getDirtyObjects())
{
final String entityName = HibernateUtil.getInstance().getEntityName(revision.getID());
- if (revision.getVersion() == 0)
+ final InternalCDORevision existingRevision = existingRevisions.get(revision.getID());
+ if (existingRevision != null)
{
- // a revision which does not have the version set correctly
- // read from the db and copy the version
- final String entityNameValue = HibernateUtil.getInstance().getEntityName(revision.getID());
- final Serializable idValue = HibernateUtil.getInstance().getIdValue(revision.getID());
- final CDORevision cdoRevision = (CDORevision)session.get(entityNameValue, idValue);
- if (cdoRevision != null)
- {
- revision.setVersion(cdoRevision.getVersion());
- }
+ revision.setVersion(existingRevision.getVersion());
}
final InternalCDORevision cdoRevision = (InternalCDORevision)session.merge(entityName, revision);

Back to the top