diff options
author | Martin Taal | 2012-11-27 15:48:30 +0000 |
---|---|---|
committer | Martin Taal | 2012-11-27 15:48:30 +0000 |
commit | 49eec08d08009bf508c6dddf2ba185a05d4a1931 (patch) | |
tree | b5f21fc4f87f62936838553d6c4a24d4eca09ba9 /plugins/org.eclipse.emf.cdo.server.hibernate | |
parent | adf1e145fb0b3a77e79b409e71750b5de37d5e8d (diff) | |
download | cdo-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.java | 34 |
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); |