[hibernate-commits] Hibernate SVN: r12752 - in shards/trunk/src: test/org/hibernate/shards/integration/model and 1 other directory.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Wed Jul 11 12:02:55 EDT 2007
Author: buurzgoth
Date: 2007-07-11 12:02:55 -0400 (Wed, 11 Jul 2007)
New Revision: 12752
Modified:
shards/trunk/src/java/org/hibernate/shards/session/ShardedSessionImpl.java
shards/trunk/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java
Log:
Fix bug in replicate(). Implement merge().
Modified: shards/trunk/src/java/org/hibernate/shards/session/ShardedSessionImpl.java
===================================================================
--- shards/trunk/src/java/org/hibernate/shards/session/ShardedSessionImpl.java 2007-07-11 06:43:23 UTC (rev 12751)
+++ shards/trunk/src/java/org/hibernate/shards/session/ShardedSessionImpl.java 2007-07-11 16:02:55 UTC (rev 12752)
@@ -20,66 +20,33 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.hibernate.CacheMode;
-import org.hibernate.Criteria;
-import org.hibernate.EntityMode;
-import org.hibernate.Filter;
-import org.hibernate.FlushMode;
-import org.hibernate.HibernateException;
-import org.hibernate.Interceptor;
-import org.hibernate.LockMode;
-import org.hibernate.Query;
-import org.hibernate.ReplicationMode;
-import org.hibernate.SQLQuery;
-import org.hibernate.SessionException;
-import org.hibernate.Transaction;
-import org.hibernate.TransientObjectException;
-import org.hibernate.UnresolvableObjectException;
+import org.hibernate.*;
import org.hibernate.classic.Session;
import org.hibernate.engine.SessionFactoryImplementor;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.proxy.HibernateProxy;
-import org.hibernate.shards.CrossShardAssociationException;
-import org.hibernate.shards.Shard;
-import org.hibernate.shards.ShardId;
-import org.hibernate.shards.ShardImpl;
-import org.hibernate.shards.ShardOperation;
-import org.hibernate.shards.ShardedTransaction;
+import org.hibernate.shards.*;
import org.hibernate.shards.criteria.CriteriaFactoryImpl;
import org.hibernate.shards.criteria.CriteriaId;
import org.hibernate.shards.criteria.ShardedCriteriaImpl;
import org.hibernate.shards.engine.ShardedSessionFactoryImplementor;
import org.hibernate.shards.engine.ShardedSessionImplementor;
import org.hibernate.shards.id.ShardEncodingIdentifierGenerator;
-import org.hibernate.shards.query.AdHocQueryFactoryImpl;
-import org.hibernate.shards.query.ExitOperationsQueryCollector;
-import org.hibernate.shards.query.NamedQueryFactoryImpl;
-import org.hibernate.shards.query.QueryId;
-import org.hibernate.shards.query.ShardedQueryImpl;
+import org.hibernate.shards.query.*;
import org.hibernate.shards.stat.ShardedSessionStatistics;
import org.hibernate.shards.strategy.ShardStrategy;
import org.hibernate.shards.strategy.exit.FirstNonNullResultExitStrategy;
import org.hibernate.shards.strategy.selection.ShardResolutionStrategyData;
import org.hibernate.shards.strategy.selection.ShardResolutionStrategyDataImpl;
import org.hibernate.shards.transaction.ShardedTransactionImpl;
-import org.hibernate.shards.util.Iterables;
-import org.hibernate.shards.util.Lists;
-import org.hibernate.shards.util.Maps;
-import org.hibernate.shards.util.Pair;
-import org.hibernate.shards.util.Preconditions;
-import org.hibernate.shards.util.Sets;
+import org.hibernate.shards.util.*;
import org.hibernate.stat.SessionStatistics;
import org.hibernate.type.Type;
import java.io.Serializable;
import java.sql.Connection;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
/**
* Concrete implementation of a ShardedSession, and also the central component of
@@ -612,6 +579,7 @@
List<ShardId> shardIds = selectShardIdsFromShardResolutionStrategyData(new
ShardResolutionStrategyDataImpl(object.getClass(), id));
if (shardIds.size() == 1) {
+ setCurrentSubgraphShardId(shardIds.get(0));
shardIdsToShards.get(shardIds.get(0)).establishSession().replicate(entityName, object, replicationMode);
} else {
Object result = null;
@@ -901,19 +869,30 @@
return shardIdListToShardList(shardIds);
}
- /**
- * Unsupported. This is a scope decision, not a technical decision.
- */
public Object merge(Object object) throws HibernateException {
- throw new UnsupportedOperationException();
+ return merge(null, object);
}
- /**
- * Unsupported. This is a scope decision, not a technical decision.
- */
public Object merge(String entityName, Object object)
throws HibernateException {
- throw new UnsupportedOperationException();
+ Serializable id = extractId(object);
+ List<ShardId> shardIds = selectShardIdsFromShardResolutionStrategyData(new
+ ShardResolutionStrategyDataImpl(object.getClass(), id));
+ if (shardIds.size() == 1) {
+ setCurrentSubgraphShardId(shardIds.get(0));
+ return shardIdsToShards.get(shardIds.get(0)).establishSession().merge(entityName, object);
+ } else {
+ Object result = null;
+ if (id != null) result = get(object.getClass(), id);
+ if (result == null) { // non-persisted object
+ ShardId shardId = selectShardIdForNewObject(object);
+ setCurrentSubgraphShardId(shardId);
+ return shardIdsToShards.get(shardId).establishSession().merge(entityName, object);
+ } else {
+ Shard objectShard = getShardForObject(result, shardIdListToShardList(shardIds));
+ return objectShard.establishSession().merge(entityName, object);
+ }
+ }
}
public void persist(Object object) throws HibernateException {
@@ -1501,7 +1480,8 @@
List<ShardId> selectShardIdsFromShardResolutionStrategyData(ShardResolutionStrategyData srsd) {
IdentifierGenerator idGenerator = shardedSessionFactory.getIdentifierGenerator(srsd.getEntityName());
- if (idGenerator instanceof ShardEncodingIdentifierGenerator) {
+ if ((idGenerator instanceof ShardEncodingIdentifierGenerator) &&
+ (srsd.getId() != null)) {
return Collections.singletonList(((ShardEncodingIdentifierGenerator)idGenerator).extractShardId(srsd.getId()));
}
return shardStrategy.getShardResolutionStrategy().selectShardIdsFromShardResolutionStrategyData(srsd);
Modified: shards/trunk/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java
===================================================================
--- shards/trunk/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java 2007-07-11 06:43:23 UTC (rev 12751)
+++ shards/trunk/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java 2007-07-11 16:02:55 UTC (rev 12752)
@@ -900,6 +900,35 @@
}
}
+ public void testMergeUnpersisted() {
+ session.beginTransaction();
+ Building b = building("b1");
+ Building returnedB = (Building)session.merge(b);
+ commitAndResetSession();
+ Building mergedB = (Building)session.get(Building.class,
+ returnedB.getBuildingId());
+ assertNotNull(mergedB);
+ assertEquals("b1", mergedB.getName());
+ }
+
+ public void testMergePersisted() {
+ session.beginTransaction();
+ Building b = building("b1");
+ session.save(b);
+ commitAndResetSession();
+ session.evict(b);
+
+ session.beginTransaction();
+ b.setName("b2");
+ session.merge(b);
+ assertFalse(session.contains(b));
+ commitAndResetSession();
+
+ Building mergedB = (Building)session.get(Building.class, b.getBuildingId());
+ assertNotNull(mergedB);
+ assertEquals("b2", mergedB.getName());
+ }
+
public void testReplicate() {
session.beginTransaction();
Building idB = building("just need to get id");
More information about the hibernate-commits
mailing list