Hibernate SVN: r11481 - trunk/Hibernate3/src/org/hibernate/transaction.
by hibernate-commits@lists.jboss.org
Author: steve.ebersole(a)jboss.com
Date: 2007-05-08 06:50:39 -0400 (Tue, 08 May 2007)
New Revision: 11481
Modified:
trunk/Hibernate3/src/org/hibernate/transaction/WebSphereExtendedJTATransactionLookup.java
Log:
HHH-2580 : WebSphereExtendedJTATransactionLookup patch
Modified: trunk/Hibernate3/src/org/hibernate/transaction/WebSphereExtendedJTATransactionLookup.java
===================================================================
--- trunk/Hibernate3/src/org/hibernate/transaction/WebSphereExtendedJTATransactionLookup.java 2007-05-08 10:50:24 UTC (rev 11480)
+++ trunk/Hibernate3/src/org/hibernate/transaction/WebSphereExtendedJTATransactionLookup.java 2007-05-08 10:50:39 UTC (rev 11481)
@@ -24,10 +24,12 @@
/**
* Support for proprietary interfaces for registering synchronizations in WebSphere 6.
+ *
* @author Gavin King
*/
public class WebSphereExtendedJTATransactionLookup implements TransactionManagerLookup {
-
+ public static final String E_TRN_JNDI_NAME = "java:comp/websphere/ExtendedJTATransaction";
+
public TransactionManager getTransactionManager(Properties props)
throws HibernateException {
return new TransactionManagerAdapter(props);
@@ -36,25 +38,25 @@
public String getUserTransactionName() {
return "java:comp/UserTransaction";
}
-
+
public static class TransactionManagerAdapter implements TransactionManager {
private final Properties properties;
private final Class synchronizationCallbackClass;
private final Method registerSynchronizationMethod;
private final Method getLocalIdMethod;
-
+
private TransactionManagerAdapter(Properties props) {
this.properties = props;
try {
synchronizationCallbackClass = Class.forName("com.ibm.websphere.jtaextensions.SynchronizationCallback");
Class extendedJTATransactionClass = Class.forName("com.ibm.websphere.jtaextensions.ExtendedJTATransaction");
- registerSynchronizationMethod = extendedJTATransactionClass.getMethod(
- "registerSynchronizationCallbackForCurrentTran",
- new Class[] { synchronizationCallbackClass }
+ registerSynchronizationMethod = extendedJTATransactionClass.getMethod(
+ "registerSynchronizationCallbackForCurrentTran",
+ new Class[] { synchronizationCallbackClass }
);
getLocalIdMethod = extendedJTATransactionClass.getMethod( "getLocalId", null );
-
+
}
catch (ClassNotFoundException cnfe) {
throw new HibernateException(cnfe);
@@ -63,7 +65,7 @@
throw new HibernateException(nsme);
}
}
-
+
public void begin() throws NotSupportedException, SystemException {
throw new UnsupportedOperationException();
}
@@ -79,10 +81,10 @@
}
public Transaction getTransaction() throws SystemException {
- return new TransactionAdapter(properties);
+ return new TransactionAdapter( properties );
}
- public void resume(Transaction txn) throws InvalidTransactionException,
+ public void resume(Transaction txn) throws InvalidTransactionException,
IllegalStateException, SystemException {
throw new UnsupportedOperationException();
}
@@ -106,13 +108,13 @@
}
public class TransactionAdapter implements Transaction {
-
- private final Object extendedJTATransaction;
-
+ private Object extendedJTATransaction;
+
private TransactionAdapter(Properties props) {
try {
- extendedJTATransaction = NamingHelper.getInitialContext(props)
- .lookup("java:comp/websphere/ExtendedJTATransaction");
+ if (extendedJTATransaction == null) {
+ extendedJTATransaction = NamingHelper.getInitialContext( props ).lookup( E_TRN_JNDI_NAME );
+ }
}
catch (NamingException ne) {
throw new HibernateException(ne);
@@ -122,13 +124,13 @@
public void registerSynchronization(final Synchronization synchronization)
throws RollbackException, IllegalStateException,
SystemException {
-
+
final InvocationHandler ih = new InvocationHandler() {
-
+
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ( "afterCompletion".equals( method.getName() ) ) {
- int status = args[2].equals(Boolean.TRUE) ?
- Status.STATUS_COMMITTED :
+ int status = args[2].equals(Boolean.TRUE) ?
+ Status.STATUS_COMMITTED :
Status.STATUS_UNKNOWN;
synchronization.afterCompletion(status);
}
@@ -140,19 +142,19 @@
}
return null;
}
-
+
};
-
- final Object synchronizationCallback = Proxy.newProxyInstance(
- getClass().getClassLoader(),
- new Class[] { synchronizationCallbackClass },
- ih
+
+ final Object synchronizationCallback = Proxy.newProxyInstance(
+ getClass().getClassLoader(),
+ new Class[] { synchronizationCallbackClass },
+ ih
);
-
+
try {
- registerSynchronizationMethod.invoke(
- extendedJTATransaction,
- new Object[] { synchronizationCallback }
+ registerSynchronizationMethod.invoke(
+ extendedJTATransaction,
+ new Object[] { synchronizationCallback }
);
}
catch (Exception e) {
@@ -160,11 +162,11 @@
}
}
-
+
public int hashCode() {
return getLocalId().hashCode();
}
-
+
public boolean equals(Object other) {
if ( !(other instanceof TransactionAdapter) ) return false;
TransactionAdapter that = (TransactionAdapter) other;
@@ -185,20 +187,20 @@
IllegalStateException, SystemException {
throw new UnsupportedOperationException();
}
-
+
public boolean delistResource(XAResource resource, int i)
throws IllegalStateException, SystemException {
throw new UnsupportedOperationException();
}
-
+
public boolean enlistResource(XAResource resource)
throws RollbackException, IllegalStateException,
SystemException {
throw new UnsupportedOperationException();
}
-
+
public int getStatus() throws SystemException {
- return new Integer(0).equals( getLocalId() ) ?
+ return new Integer(0).equals( getLocalId() ) ?
Status.STATUS_NO_TRANSACTION : Status.STATUS_ACTIVE;
}
@@ -211,7 +213,7 @@
throw new UnsupportedOperationException();
}
}
-
+
}
-
+
}
16 years, 12 months
Hibernate SVN: r11480 - branches/Branch_3_2/Hibernate3/src/org/hibernate/transaction.
by hibernate-commits@lists.jboss.org
Author: steve.ebersole(a)jboss.com
Date: 2007-05-08 06:50:24 -0400 (Tue, 08 May 2007)
New Revision: 11480
Modified:
branches/Branch_3_2/Hibernate3/src/org/hibernate/transaction/WebSphereExtendedJTATransactionLookup.java
Log:
HHH-2580 : WebSphereExtendedJTATransactionLookup patch
Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/transaction/WebSphereExtendedJTATransactionLookup.java
===================================================================
--- branches/Branch_3_2/Hibernate3/src/org/hibernate/transaction/WebSphereExtendedJTATransactionLookup.java 2007-05-08 01:16:39 UTC (rev 11479)
+++ branches/Branch_3_2/Hibernate3/src/org/hibernate/transaction/WebSphereExtendedJTATransactionLookup.java 2007-05-08 10:50:24 UTC (rev 11480)
@@ -24,10 +24,12 @@
/**
* Support for proprietary interfaces for registering synchronizations in WebSphere 6.
+ *
* @author Gavin King
*/
public class WebSphereExtendedJTATransactionLookup implements TransactionManagerLookup {
-
+ public static final String E_TRN_JNDI_NAME = "java:comp/websphere/ExtendedJTATransaction";
+
public TransactionManager getTransactionManager(Properties props)
throws HibernateException {
return new TransactionManagerAdapter(props);
@@ -36,25 +38,25 @@
public String getUserTransactionName() {
return "java:comp/UserTransaction";
}
-
+
public static class TransactionManagerAdapter implements TransactionManager {
private final Properties properties;
private final Class synchronizationCallbackClass;
private final Method registerSynchronizationMethod;
private final Method getLocalIdMethod;
-
+
private TransactionManagerAdapter(Properties props) {
this.properties = props;
try {
synchronizationCallbackClass = Class.forName("com.ibm.websphere.jtaextensions.SynchronizationCallback");
Class extendedJTATransactionClass = Class.forName("com.ibm.websphere.jtaextensions.ExtendedJTATransaction");
- registerSynchronizationMethod = extendedJTATransactionClass.getMethod(
- "registerSynchronizationCallbackForCurrentTran",
- new Class[] { synchronizationCallbackClass }
+ registerSynchronizationMethod = extendedJTATransactionClass.getMethod(
+ "registerSynchronizationCallbackForCurrentTran",
+ new Class[] { synchronizationCallbackClass }
);
getLocalIdMethod = extendedJTATransactionClass.getMethod( "getLocalId", null );
-
+
}
catch (ClassNotFoundException cnfe) {
throw new HibernateException(cnfe);
@@ -63,7 +65,7 @@
throw new HibernateException(nsme);
}
}
-
+
public void begin() throws NotSupportedException, SystemException {
throw new UnsupportedOperationException();
}
@@ -79,10 +81,10 @@
}
public Transaction getTransaction() throws SystemException {
- return new TransactionAdapter(properties);
+ return new TransactionAdapter( properties );
}
- public void resume(Transaction txn) throws InvalidTransactionException,
+ public void resume(Transaction txn) throws InvalidTransactionException,
IllegalStateException, SystemException {
throw new UnsupportedOperationException();
}
@@ -106,13 +108,13 @@
}
public class TransactionAdapter implements Transaction {
-
- private final Object extendedJTATransaction;
-
+ private Object extendedJTATransaction;
+
private TransactionAdapter(Properties props) {
try {
- extendedJTATransaction = NamingHelper.getInitialContext(props)
- .lookup("java:comp/websphere/ExtendedJTATransaction");
+ if (extendedJTATransaction == null) {
+ extendedJTATransaction = NamingHelper.getInitialContext( props ).lookup( E_TRN_JNDI_NAME );
+ }
}
catch (NamingException ne) {
throw new HibernateException(ne);
@@ -122,13 +124,13 @@
public void registerSynchronization(final Synchronization synchronization)
throws RollbackException, IllegalStateException,
SystemException {
-
+
final InvocationHandler ih = new InvocationHandler() {
-
+
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ( "afterCompletion".equals( method.getName() ) ) {
- int status = args[2].equals(Boolean.TRUE) ?
- Status.STATUS_COMMITTED :
+ int status = args[2].equals(Boolean.TRUE) ?
+ Status.STATUS_COMMITTED :
Status.STATUS_UNKNOWN;
synchronization.afterCompletion(status);
}
@@ -140,31 +142,31 @@
}
return null;
}
-
+
};
-
- final Object synchronizationCallback = Proxy.newProxyInstance(
- getClass().getClassLoader(),
- new Class[] { synchronizationCallbackClass },
- ih
+
+ final Object synchronizationCallback = Proxy.newProxyInstance(
+ getClass().getClassLoader(),
+ new Class[] { synchronizationCallbackClass },
+ ih
+ );
+
+ try {
+ registerSynchronizationMethod.invoke(
+ extendedJTATransaction,
+ new Object[] { synchronizationCallback }
);
-
- try {
- registerSynchronizationMethod.invoke(
- extendedJTATransaction,
- new Object[] { synchronizationCallback }
- );
}
catch (Exception e) {
throw new HibernateException(e);
}
}
-
+
public int hashCode() {
return getLocalId().hashCode();
}
-
+
public boolean equals(Object other) {
if ( !(other instanceof TransactionAdapter) ) return false;
TransactionAdapter that = (TransactionAdapter) other;
@@ -185,20 +187,20 @@
IllegalStateException, SystemException {
throw new UnsupportedOperationException();
}
-
+
public boolean delistResource(XAResource resource, int i)
throws IllegalStateException, SystemException {
throw new UnsupportedOperationException();
}
-
+
public boolean enlistResource(XAResource resource)
throws RollbackException, IllegalStateException,
SystemException {
throw new UnsupportedOperationException();
}
-
+
public int getStatus() throws SystemException {
- return new Integer(0).equals( getLocalId() ) ?
+ return new Integer(0).equals( getLocalId() ) ?
Status.STATUS_NO_TRANSACTION : Status.STATUS_ACTIVE;
}
@@ -211,7 +213,7 @@
throw new UnsupportedOperationException();
}
}
-
+
}
-
+
}
16 years, 12 months
Hibernate SVN: r11479 - in trunk/HibernateExt/search/src/java/org/hibernate/search/backend: impl and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2007-05-07 21:16:39 -0400 (Mon, 07 May 2007)
New Revision: 11479
Added:
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkQueue.java
Modified:
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/LuceneWork.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/QueueingProcessor.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/PostTransactionWorkQueueSynchronization.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java
Log:
HSEARCH-44 build the Lucene Document before the transaction completion
Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/LuceneWork.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/LuceneWork.java 2007-05-08 00:58:54 UTC (rev 11478)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/LuceneWork.java 2007-05-08 01:16:39 UTC (rev 11479)
@@ -11,6 +11,7 @@
* @author Emmanuel Bernard
*/
public abstract class LuceneWork implements Serializable {
+ //TODO set a serial id
private Document document;
private Class entityClass;
private Serializable id;
Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/QueueingProcessor.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/QueueingProcessor.java 2007-05-08 00:58:54 UTC (rev 11478)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/QueueingProcessor.java 2007-05-08 01:16:39 UTC (rev 11479)
@@ -11,6 +11,8 @@
* No thread safety has to be implemented, the queue being scoped already
* The implementation must be "stateless" wrt the queue through (ie not store the queue state)
*
+ * FIXME this Interface does not make much sense, since the impl will not be changed
+ *
* @author Emmanuel Bernard
*/
public interface QueueingProcessor {
@@ -18,17 +20,20 @@
* Add a work
* TODO move that womewhere else, it does not really fit here
*/
- void add(Object entity, Serializable id, WorkType workType, List<Work> queue);
+ void add(Object entity, Serializable id, WorkType workType, WorkQueue workQueue);
/**
+ * prepare resources for a later performWorks call
+ */
+ void prepareWorks(WorkQueue workQueue);
+
+ /**
* Execute works
- * @param queue
*/
- void performWork(List<Work> queue);
+ void performWorks(WorkQueue workQueue);
/**
* Rollback works
- * @param queue
*/
- void cancelWork(List<Work> queue);
+ void cancelWorks(WorkQueue workQueue);
}
Added: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkQueue.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkQueue.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkQueue.java 2007-05-08 01:16:39 UTC (rev 11479)
@@ -0,0 +1,52 @@
+//$Id: $
+package org.hibernate.search.backend;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import org.hibernate.annotations.common.AssertionFailure;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class WorkQueue {
+ //TODO set a serial number
+ private List<Work> queue;
+
+ private List<LuceneWork> sealedQueue;
+
+ public WorkQueue(int size) {
+ queue = new ArrayList<Work>(size);
+ }
+
+ public WorkQueue() {
+ this(10);
+ }
+
+
+ public void add(Work work) {
+ queue.add(work);
+ }
+
+
+ public List<Work> getQueue() {
+ return queue;
+ }
+
+
+ public List<LuceneWork> getSealedQueue() {
+ if (sealedQueue == null) throw new AssertionFailure("Access a Sealed WorkQueue whcih has not been sealed");
+ return sealedQueue;
+ }
+
+ public void setSealedQueue(List<LuceneWork> sealedQueue) {
+ //invalidate the working queue for serializability
+ queue = null;
+ this.sealedQueue = sealedQueue;
+ }
+
+ public void clear() {
+ queue.clear();
+ if (sealedQueue != null) sealedQueue.clear();
+ }
+}
Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java 2007-05-08 00:58:54 UTC (rev 11478)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java 2007-05-08 01:16:39 UTC (rev 11479)
@@ -21,12 +21,13 @@
import org.hibernate.search.backend.QueueingProcessor;
import org.hibernate.search.backend.Work;
import org.hibernate.search.backend.WorkType;
+import org.hibernate.search.backend.WorkQueue;
import org.hibernate.search.backend.impl.jms.JMSBackendQueueProcessorFactory;
import org.hibernate.search.backend.impl.lucene.LuceneBackendQueueProcessorFactory;
import org.hibernate.search.engine.DocumentBuilder;
/**
- * Batch work until #performWork is called.
+ * Batch work until #performWorks is called.
* The work is then executed synchronously or asynchronously
*
* @author Emmanuel Bernard
@@ -91,17 +92,17 @@
searchFactory.setBackendQueueProcessorFactory( backendQueueProcessorFactory );
}
- public void add(Object entity, Serializable id, WorkType workType, List<Work> queue) {
- //don't check for builder it's done in performWork
+ public void add(Object entity, Serializable id, WorkType workType, WorkQueue workQueue) {
+ //don't check for builder it's done in performWorks
Work work = new Work(entity, id, workType);
- queue.add( work );
+ workQueue.add( work );
}
- //TODO implements parallel batchWorkers (one per Directory)
- public void performWork(List<Work> queue) {
+
+ public void prepareWorks(WorkQueue workQueue) {
+ List<Work> queue = workQueue.getQueue();
int initialSize = queue.size();
List<LuceneWork> luceneQueue = new ArrayList<LuceneWork>( initialSize ); //TODO load factor for containedIn
-
for ( int i = 0 ; i < initialSize ; i++ ) {
Work work = queue.get( i );
queue.set( i, null ); // help GC and avoid 2 loaded queues in memory
@@ -110,8 +111,13 @@
if ( builder == null ) return; //or exception?
builder.addWorkToQueue(work.getEntity(), work.getId(), work.getType(), luceneQueue, searchFactory);
}
+ workQueue.setSealedQueue( luceneQueue );
+ }
- Runnable processor = backendQueueProcessorFactory.getProcessor( luceneQueue );
+ //TODO implements parallel batchWorkers (one per Directory)
+ public void performWorks(WorkQueue workQueue) {
+
+ Runnable processor = backendQueueProcessorFactory.getProcessor( workQueue.getSealedQueue() );
if ( sync ) {
processor.run();
}
@@ -120,8 +126,8 @@
}
}
- public void cancelWork(List<Work> queue) {
- queue.clear();
+ public void cancelWorks(WorkQueue workQueue) {
+ workQueue.clear();
}
@Override
Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/PostTransactionWorkQueueSynchronization.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/PostTransactionWorkQueueSynchronization.java 2007-05-08 00:58:54 UTC (rev 11478)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/PostTransactionWorkQueueSynchronization.java 2007-05-08 01:16:39 UTC (rev 11479)
@@ -8,9 +8,9 @@
import javax.transaction.Synchronization;
import org.hibernate.search.backend.QueueingProcessor;
-import org.hibernate.search.backend.LuceneWork;
import org.hibernate.search.backend.WorkType;
import org.hibernate.search.backend.Work;
+import org.hibernate.search.backend.WorkQueue;
import org.hibernate.search.util.WeakIdentityHashMap;
/**
@@ -22,7 +22,7 @@
private QueueingProcessor queueingProcessor;
private boolean consumed;
private WeakIdentityHashMap queuePerTransaction;
- private List<Work> queue = new ArrayList<Work>();
+ private WorkQueue queue = new WorkQueue();
/**
* in transaction work
@@ -41,15 +41,16 @@
}
public void beforeCompletion() {
+ queueingProcessor.prepareWorks(queue);
}
public void afterCompletion(int i) {
try {
if ( Status.STATUS_COMMITTED == i ) {
- queueingProcessor.performWork(queue);
+ queueingProcessor.performWorks(queue);
}
else {
- queueingProcessor.cancelWork(queue);
+ queueingProcessor.cancelWorks(queue);
}
}
finally {
Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java 2007-05-08 00:58:54 UTC (rev 11478)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java 2007-05-08 01:16:39 UTC (rev 11479)
@@ -7,10 +7,10 @@
import java.io.Serializable;
import org.hibernate.search.backend.Worker;
-import org.hibernate.search.backend.LuceneWork;
import org.hibernate.search.backend.QueueingProcessor;
import org.hibernate.search.backend.WorkType;
import org.hibernate.search.backend.Work;
+import org.hibernate.search.backend.WorkQueue;
import org.hibernate.search.backend.impl.BatchedQueueingProcessor;
import org.hibernate.search.util.WeakIdentityHashMap;
import org.hibernate.search.SearchFactory;
@@ -44,9 +44,10 @@
txSync.add( entity, id, workType );
}
else {
- List<Work> queue = new ArrayList<Work>(2); //one work can be split
+ WorkQueue queue = new WorkQueue(2); //one work can be split
queueingProcessor.add( entity, id, workType, queue );
- queueingProcessor.performWork( queue );
+ queueingProcessor.prepareWorks( queue );
+ queueingProcessor.performWorks( queue );
}
}
16 years, 12 months
Hibernate SVN: r11478 - in trunk/HibernateExt/shards/src: java/org/hibernate/shards/query and 4 other directories.
by hibernate-commits@lists.jboss.org
Author: buurzgoth
Date: 2007-05-07 20:58:54 -0400 (Mon, 07 May 2007)
New Revision: 11478
Added:
trunk/HibernateExt/shards/src/java/org/hibernate/shards/stat/
trunk/HibernateExt/shards/src/java/org/hibernate/shards/stat/ShardedSessionStatistics.java
Modified:
trunk/HibernateExt/shards/src/java/org/hibernate/shards/Shard.java
trunk/HibernateExt/shards/src/java/org/hibernate/shards/ShardImpl.java
trunk/HibernateExt/shards/src/java/org/hibernate/shards/query/QueryResult.java
trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java
trunk/HibernateExt/shards/src/test/org/hibernate/shards/ShardDefaultMock.java
trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java
Log:
Implement a bunch of methods in ShardedSessionImpl
Modified: trunk/HibernateExt/shards/src/java/org/hibernate/shards/Shard.java
===================================================================
--- trunk/HibernateExt/shards/src/java/org/hibernate/shards/Shard.java 2007-05-08 00:51:04 UTC (rev 11477)
+++ trunk/HibernateExt/shards/src/java/org/hibernate/shards/Shard.java 2007-05-08 00:58:54 UTC (rev 11478)
@@ -43,6 +43,7 @@
* itself?
*
* @author Max Ross <maxr(a)google.com>
+ * tomislav(a)google.com (Tomislav Nad)
*/
public interface Shard {
@@ -114,6 +115,41 @@
List<Object> list(CriteriaId criteriaId);
/**
+ * @see Session#load(Class, Serializable)
+ */
+ Object load(Class<?> clazz, Serializable id);
+
+ /**
+ * @see Session#load(Class, Serializable, LockMode)
+ */
+ Object load(Class<?> clazz, Serializable id, LockMode lockMode);
+
+ /**
+ * @see Session#load(String, Serializable)
+ */
+ Object load(String entityName, Serializable id);
+
+ /**
+ * @see Session#load(String, Serializable, LockMode)
+ */
+ Object load(String entityName, Serializable id, LockMode lockMode);
+
+ /**
+ * @see Session#load(Object, Serializable)
+ */
+ void load(Object object, Serializable id);
+
+ /**
+ * @see Session#lock(Object, LockMode)
+ */
+ void lock(Object object, LockMode lockMode);
+
+ /**
+ * @see Session#lock(String, Object, LockMode)
+ */
+ void lock(String entityName, Object object, LockMode lockMode);
+
+ /**
* @see Criteria#uniqueResult()
*/
Object uniqueResult(CriteriaId criteriaId);
@@ -124,6 +160,21 @@
Serializable save(String entityName, Object obj);
/**
+ * @see Session#persist(String, Object)
+ */
+ void persist(String entityName, Object obj);
+
+ /**
+ * @see Session#refresh(Object)
+ */
+ void refresh(Object object);
+
+ /**
+ * @see Session#refresh(Object, LockMode)
+ */
+ void refresh(Object object, LockMode lockMode);
+
+ /**
* @see Session#saveOrUpdate(Object)
*/
void saveOrUpdate(Object obj);
@@ -154,6 +205,16 @@
void delete(String entityName, Object object);
/**
+ * @see Session#getCurrentLockMode(Object)
+ */
+ LockMode getCurrentLockMode(Object object);
+
+ /**
+ * @see Session#getEntityName(Object)
+ */
+ String getEntityName(Object object);
+
+ /**
* @return the ids of the virtual shards that are mapped to this physical shard.
* The returned Set is unmodifiable.
*/
Modified: trunk/HibernateExt/shards/src/java/org/hibernate/shards/ShardImpl.java
===================================================================
--- trunk/HibernateExt/shards/src/java/org/hibernate/shards/ShardImpl.java 2007-05-08 00:51:04 UTC (rev 11477)
+++ trunk/HibernateExt/shards/src/java/org/hibernate/shards/ShardImpl.java 2007-05-08 00:58:54 UTC (rev 11478)
@@ -37,11 +37,7 @@
import org.hibernate.shards.util.Sets;
import java.io.Serializable;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
/**
* Concrete implementation of the {@link Shard} interface.
@@ -265,6 +261,34 @@
return establishSession().get(entityName, id, lockMode);
}
+ public Object load(Class<?> clazz, Serializable id) {
+ return establishSession().load(clazz, id);
+ }
+
+ public Object load(Class<?> clazz, Serializable id, LockMode lockMode) {
+ return establishSession().load(clazz, id, lockMode);
+ }
+
+ public Object load(String entityName, Serializable id) {
+ return establishSession().load(entityName, id);
+ }
+
+ public Object load(String entityName, Serializable id, LockMode lockMode) {
+ return establishSession().load(entityName, id, lockMode);
+ }
+
+ public void load(Object object, Serializable id) {
+ establishSession().load(object, id);
+ }
+
+ public void lock(Object object, LockMode lockMode) {
+ establishSession().lock(object, lockMode);
+ }
+
+ public void lock(String entityName, Object object, LockMode lockMode) {
+ establishSession().lock(entityName, object, lockMode);
+ }
+
@SuppressWarnings("unchecked")
public List<Object> list(CriteriaId criteriaId) {
return criteriaMap.get(criteriaId).list();
@@ -312,6 +336,18 @@
return establishSession().save(entityName, obj);
}
+ public void persist(String entityName, Object obj) {
+ establishSession().persist(entityName, obj);
+ }
+
+ public void refresh(Object object) {
+ establishSession().refresh(object);
+ }
+
+ public void refresh(Object object, LockMode lockMode) {
+ establishSession().refresh(object, lockMode);
+ }
+
public void saveOrUpdate(Object obj) {
establishSession().saveOrUpdate(obj);
}
@@ -336,6 +372,14 @@
establishSession().delete(entityName, object);
}
+ public LockMode getCurrentLockMode(Object object) {
+ return establishSession().getCurrentLockMode(object);
+ }
+
+ public String getEntityName(Object object) {
+ return establishSession().getEntityName(object);
+ }
+
@Override
public String toString() {
return getSessionFactoryImplementor().getSettings().getSessionFactoryName();
Modified: trunk/HibernateExt/shards/src/java/org/hibernate/shards/query/QueryResult.java
===================================================================
--- trunk/HibernateExt/shards/src/java/org/hibernate/shards/query/QueryResult.java 2007-05-08 00:51:04 UTC (rev 11477)
+++ trunk/HibernateExt/shards/src/java/org/hibernate/shards/query/QueryResult.java 2007-05-08 00:58:54 UTC (rev 11478)
@@ -22,9 +22,9 @@
import org.hibernate.shards.util.Lists;
import org.hibernate.shards.util.Maps;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
-import java.util.Collections;
/**
* @author maulik(a)google.com (Maulik Shah)
@@ -33,7 +33,7 @@
private final Map<Shard, List> resultMap = Maps.newHashMap();
- private final List<?> entityList = Lists.newArrayList();
+ private final List entityList = Lists.newArrayList();
public Map<Shard, List> getResultMap() {
return Collections.unmodifiableMap(resultMap);
Modified: trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java
===================================================================
--- trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java 2007-05-08 00:51:04 UTC (rev 11477)
+++ trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java 2007-05-08 00:58:54 UTC (rev 11478)
@@ -20,64 +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.*;
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
@@ -86,6 +55,7 @@
* other components of Hibernate Shards. This class is not threadsafe.
*
* @author Max Ross <maxr(a)google.com>
+ * tomislav(a)google.com (Tomislav Nad)
*/
public class ShardedSessionImpl implements ShardedSession, ShardedSessionImplementor,
ShardIdResolver {
@@ -404,7 +374,8 @@
}
/**
- * Unsupported. This is a scope decision, not a technical decision.
+ * We do not have sharded Connections as that would mean pushing sharding to
+ * connection-level.
*/
public Connection connection() throws HibernateException {
throw new UnsupportedOperationException();
@@ -521,43 +492,81 @@
}
}
- /**
- * Unsupported. This is a scope decision, not a technical decision.
- */
- public Object load(Class theClass, Serializable id, LockMode lockMode)
+ public Object load(Class clazz, Serializable id, LockMode lockMode)
throws HibernateException {
- throw new UnsupportedOperationException();
+ List<ShardId> shardIds = selectShardIdsFromShardResolutionStrategyData(new
+ ShardResolutionStrategyDataImpl(clazz, id));
+ if (shardIds.size() == 1) {
+ return shardIdsToShards.get(shardIds.get(0)).load(clazz, id, lockMode);
+ } else {
+ Object result = get(clazz, id, lockMode);
+ if (result == null) {
+ shardedSessionFactory.getEntityNotFoundDelegate().handleEntityNotFound(clazz.getName(), id);
+ }
+ return result;
+ }
}
- /**
- * Unsupported. This is a scope decision, not a technical decision.
- */
public Object load(String entityName, Serializable id, LockMode lockMode)
throws HibernateException {
- throw new UnsupportedOperationException();
+ List<ShardId> shardIds = selectShardIdsFromShardResolutionStrategyData(new
+ ShardResolutionStrategyDataImpl(entityName, id));
+ if (shardIds.size() == 1) {
+ return shardIdsToShards.get(shardIds.get(0)).load(entityName, id, lockMode);
+ } else {
+ Object result = get(entityName, id, lockMode);
+ if (result == null) {
+ shardedSessionFactory.getEntityNotFoundDelegate().handleEntityNotFound(entityName, id);
+ }
+ return result;
+ }
}
- /**
- * Unsupported. This is a scope decision, not a technical decision.
- */
- public Object load(Class theClass, Serializable id)
+ public Object load(Class clazz, Serializable id)
throws HibernateException {
- throw new UnsupportedOperationException();
+ List<ShardId> shardIds = selectShardIdsFromShardResolutionStrategyData(new
+ ShardResolutionStrategyDataImpl(clazz, id));
+ if (shardIds.size() == 1) {
+ return shardIdsToShards.get(shardIds.get(0)).load(clazz, id);
+ } else {
+ Object result = get(clazz, id);
+ if (result == null) {
+ shardedSessionFactory.getEntityNotFoundDelegate().handleEntityNotFound(clazz.getName(), id);
+ }
+ return result;
+ }
}
- /**
- * Unsupported. This is a scope decision, not a technical decision.
- */
public Object load(String entityName, Serializable id)
throws HibernateException {
- throw new UnsupportedOperationException();
+ List<ShardId> shardIds = selectShardIdsFromShardResolutionStrategyData(new
+ ShardResolutionStrategyDataImpl(entityName, id));
+ if (shardIds.size() == 1) {
+ return shardIdsToShards.get(shardIds.get(0)).load(entityName, id);
+ } else {
+ Object result = get(entityName, id);
+ if (result == null) {
+ shardedSessionFactory.getEntityNotFoundDelegate().handleEntityNotFound(entityName, id);
+ }
+ return result;
+ }
}
- /**
- * Unsupported. This is a scope decision, not a technical decision.
- */
public void load(Object object, Serializable id) throws HibernateException {
- throw new UnsupportedOperationException();
+ List<ShardId> shardIds = selectShardIdsFromShardResolutionStrategyData(new
+ ShardResolutionStrategyDataImpl(object.getClass(), id));
+ if (shardIds.size() == 1) {
+ shardIdsToShards.get(shardIds.get(0)).load(object, id);
+ } else {
+ Object result = get(object.getClass(), id);
+ if (result == null) {
+ shardedSessionFactory.getEntityNotFoundDelegate().handleEntityNotFound(object.getClass().getName(), id);
+ } else {
+ Shard objectShard = getShardForObject(result, shardIdListToShardList(shardIds));
+ evict(result);
+ objectShard.load(object, id);
+ }
+ }
}
/**
@@ -577,6 +586,7 @@
}
public Serializable save(String entityName, Object object) throws HibernateException {
+ // TODO(tomislav): what if we have detached instance?
ShardId shardId = getShardIdForObject(object);
if(shardId == null) {
shardId = selectShardIdForNewObject(object);
@@ -863,19 +873,21 @@
throw new UnsupportedOperationException();
}
- /**
- * Unsupported. This is a scope decision, not a technical decision.
- */
public void persist(Object object) throws HibernateException {
- throw new UnsupportedOperationException();
+ persist(null, object);
}
- /**
- * Unsupported. This is a scope decision, not a technical decision.
- */
public void persist(String entityName, Object object)
throws HibernateException {
- throw new UnsupportedOperationException();
+ // TODO(tomislav): what if we have detached object?
+ ShardId shardId = getShardIdForObject(object);
+ if(shardId == null) {
+ shardId = selectShardIdForNewObject(object);
+ }
+ Preconditions.checkNotNull(shardId);
+ setCurrentSubgraphShardId(shardId);
+ log.debug(String.format("Persisting object of type %s to shard %s", object.getClass(), shardId));
+ shardIdsToShards.get(shardId).persist(entityName, object);
}
private interface DeleteOperation {
@@ -938,48 +950,97 @@
}
public void lock(final Object object, final LockMode lockMode) throws HibernateException {
- SessionOperation<Void> op = new SessionOperation<Void>() {
- public Void apply(Session session) {
- session.lock(object, lockMode);
+ ShardOperation<Void> op = new ShardOperation<Void>() {
+ public Void execute(Shard s) {
+ s.lock(object, lockMode);
return null;
}
+ public String getOperationName() {
+ return "lock(Object object, LockMode lockMode)";
+ }
};
- invokeSessionOperationOnSessionWithObject(op, object);
+ invokeOnShardWithObject(op, object);
}
public void lock(final String entityName, final Object object, final LockMode lockMode)
throws HibernateException {
- SessionOperation<Void> op = new SessionOperation<Void>() {
- public Void apply(Session session) {
- session.lock(entityName, object, lockMode);
+ ShardOperation<Void> op = new ShardOperation<Void>() {
+ public Void execute(Shard s) {
+ s.lock(entityName, object, lockMode);
return null;
}
+ public String getOperationName() {
+ return "lock(String entityName, Object object, LockMode lockMode)";
+ }
};
- invokeSessionOperationOnSessionWithObject(op, object);
+ invokeOnShardWithObject(op, object);
}
- /**
- * Unsupported. This is a scope decision, not a technical decision.
- */
public void refresh(Object object) throws HibernateException {
- throw new UnsupportedOperationException();
+ List<Shard> candidateShards;
+ Serializable id = null;
+ try {
+ id = getIdentifier(object);
+ List<ShardId> shardIds = selectShardIdsFromShardResolutionStrategyData(new
+ ShardResolutionStrategyDataImpl(object.getClass(), id));
+ candidateShards = shardIdListToShardList(shardIds);
+ } catch (TransientObjectException toe) {
+ // detached instance
+ candidateShards = shards;
+ }
+ if (candidateShards.size() == 1) {
+ candidateShards.get(0).refresh(object);
+ } else {
+ for (Shard shard : candidateShards) {
+ try {
+ shard.refresh(object);
+ return;
+ } catch (UnresolvableObjectException uoe) {
+ // ignore
+ }
+ }
+ throw new UnresolvableObjectException(id, object.getClass().getName());
+ }
}
- /**
- * Unsupported. This is a scope decision, not a technical decision.
- */
public void refresh(Object object, LockMode lockMode)
throws HibernateException {
- throw new UnsupportedOperationException();
+ List<Shard> candidateShards;
+ Serializable id = null;
+ try {
+ id = getIdentifier(object);
+ List<ShardId> shardIds = selectShardIdsFromShardResolutionStrategyData(new
+ ShardResolutionStrategyDataImpl(object.getClass(), id));
+ candidateShards = shardIdListToShardList(shardIds);
+ } catch (TransientObjectException toe) {
+ // detached instance
+ candidateShards = shards;
+ }
+ if (candidateShards.size() == 1) {
+ candidateShards.get(0).refresh(object, lockMode);
+ } else {
+ for (Shard shard : candidateShards) {
+ try {
+ shard.refresh(object, lockMode);
+ return;
+ } catch (UnresolvableObjectException uoe) {
+ // ignore
+ }
+ }
+ throw new UnresolvableObjectException(id, object.getClass().getName());
+ }
}
public LockMode getCurrentLockMode(final Object object) throws HibernateException {
- SessionOperation<LockMode> invoker = new SessionOperation<LockMode>() {
- public LockMode apply(Session s) {
+ ShardOperation<LockMode> invoker = new ShardOperation<LockMode>() {
+ public LockMode execute(Shard s) {
return s.getCurrentLockMode(object);
}
+ public String getOperationName() {
+ return "getCurrentLockmode(Object object)";
+ }
};
- return invokeSessionOperationOnSessionWithObject(invoker, object);
+ return invokeOnShardWithObject(invoker, object);
}
public Transaction beginTransaction() throws HibernateException {
@@ -1068,12 +1129,15 @@
}
public String getEntityName(final Object object) throws HibernateException {
- SessionOperation<String> invoker = new SessionOperation<String>() {
- public String apply(Session s) {
+ ShardOperation<String> invoker = new ShardOperation<String>() {
+ public String execute(Shard s) {
return s.getEntityName(object);
}
+ public String getOperationName() {
+ return "getEntityName(Object object)";
+ }
};
- return invokeSessionOperationOnSessionWithObject(invoker, object);
+ return invokeOnShardWithObject(invoker, object);
}
public Filter enableFilter(String filterName) {
@@ -1116,11 +1180,8 @@
}
}
- /**
- * Unsupported. This is a scope decision, not a technical decision.
- */
public SessionStatistics getStatistics() {
- throw new UnsupportedOperationException();
+ return new ShardedSessionStatistics(this);
}
public void setReadOnly(Object entity, boolean readOnly) {
@@ -1135,15 +1196,17 @@
}
}
- /**
- * Unsupported. This is a scope decision, not a technical decision.
- */
public Connection disconnect() throws HibernateException {
- throw new UnsupportedOperationException();
+ for (Shard s : getShards()) {
+ s.getSession().disconnect();
+ }
+ // we do not allow application-supplied connections, so we can always return
+ // null
+ return null;
}
/**
- * Unsupported. This is a scope decision, not a technical decision.
+ * @deprecated
*/
public void reconnect() throws HibernateException {
throw new UnsupportedOperationException();
@@ -1153,7 +1216,8 @@
* Unsupported. This is a technical decision.
*/
public void reconnect(Connection connection) throws HibernateException {
- throw new UnsupportedOperationException();
+ throw new UnsupportedOperationException(
+ "Cannot reconnect a sharded session");
}
/**
@@ -1442,29 +1506,24 @@
currentSubgraphShardId.set(shardId);
}
- private interface SessionOperation<T> {
- T apply(Session session);
- }
-
/**
- * Helper method we can use when we need to find the Session with which a
- * specified object is associated and invoke the method on that Session.
+ * Helper method we can use when we need to find the Shard with which a
+ * specified object is associated and invoke the method on that Shard.
* If the object isn't associated with a Session we just invoke it on a
* random Session with the expectation that this will cause an error.
*/
- <T> T invokeSessionOperationOnSessionWithObject(SessionOperation<T> sessionOperation, Object object) throws HibernateException {
+ <T> T invokeOnShardWithObject(ShardOperation<T> so, Object object) throws HibernateException {
ShardId shardId = getShardIdForObject(object);
- Session sessionToUse;
+ Shard shardToUse;
if (shardId == null) {
// just ask this question of a random shard so we get the proper error
- sessionToUse = getSomeSession();
- if (sessionToUse == null) {
- sessionToUse = shards.get(0).establishSession();
- }
+ shardToUse = shards.get(0);
} else {
- sessionToUse = shardIdsToShards.get(shardId).establishSession();
+ shardToUse = shardIdsToShards.get(shardId);
}
- return sessionOperation.apply(sessionToUse);
+ return so.execute(shardToUse);
}
+
+
}
Added: trunk/HibernateExt/shards/src/java/org/hibernate/shards/stat/ShardedSessionStatistics.java
===================================================================
--- trunk/HibernateExt/shards/src/java/org/hibernate/shards/stat/ShardedSessionStatistics.java (rev 0)
+++ trunk/HibernateExt/shards/src/java/org/hibernate/shards/stat/ShardedSessionStatistics.java 2007-05-08 00:58:54 UTC (rev 11478)
@@ -0,0 +1,77 @@
+/**
+ * Copyright (C) 2007 Google Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+package org.hibernate.shards.stat;
+
+import org.hibernate.shards.Shard;
+import org.hibernate.shards.engine.ShardedSessionImplementor;
+import org.hibernate.shards.util.Sets;
+import org.hibernate.stat.SessionStatistics;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * Sharded implementation of the SessionStatistics that aggregates the
+ * statistics of all underlying individual SessionStatistics.
+ *
+ * @author tomislav(a)google.com (Tomislav Nad)
+ */
+public class ShardedSessionStatistics implements SessionStatistics {
+
+ private final Set<SessionStatistics> sessionStatistics;
+
+ public ShardedSessionStatistics(ShardedSessionImplementor session) {
+ sessionStatistics = Sets.newHashSet();
+ for (Shard s : session.getShards()) {
+ sessionStatistics.add(s.getSession().getStatistics());
+ }
+ }
+
+ public int getEntityCount() {
+ int count = 0;
+ for (SessionStatistics s : sessionStatistics) {
+ count += s.getEntityCount();
+ }
+ return count;
+ }
+
+ public int getCollectionCount() {
+ int count = 0;
+ for (SessionStatistics s : sessionStatistics) {
+ count += s.getCollectionCount();
+ }
+ return count;
+ }
+
+ public Set getEntityKeys() {
+ Set entityKeys = Sets.newHashSet();
+ for (SessionStatistics s : sessionStatistics) {
+ entityKeys.addAll(s.getEntityKeys());
+ }
+ return Collections.unmodifiableSet(entityKeys);
+ }
+
+ public Set getCollectionKeys() {
+ Set collectionKeys = Sets.newHashSet();
+ for (SessionStatistics s : sessionStatistics) {
+ collectionKeys.addAll(s.getCollectionKeys());
+ }
+ return Collections.unmodifiableSet(collectionKeys);
+ }
+}
Modified: trunk/HibernateExt/shards/src/test/org/hibernate/shards/ShardDefaultMock.java
===================================================================
--- trunk/HibernateExt/shards/src/test/org/hibernate/shards/ShardDefaultMock.java 2007-05-08 00:51:04 UTC (rev 11477)
+++ trunk/HibernateExt/shards/src/test/org/hibernate/shards/ShardDefaultMock.java 2007-05-08 00:58:54 UTC (rev 11478)
@@ -37,6 +37,7 @@
/**
* @author Max Ross <maxr(a)google.com>
+ * tomislav(a)google.com (Tomislav Nad)
*/
public class ShardDefaultMock implements Shard {
@@ -84,6 +85,35 @@
throw new UnsupportedOperationException();
}
+
+ public Object load(Class<?> clazz, Serializable id) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Object load(Class<?> clazz, Serializable id, LockMode lockMode) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Object load(String entityName, Serializable id) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Object load(String entityName, Serializable id, LockMode lockMode) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void load(Object object, Serializable id) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void lock(Object object, LockMode lockMode) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void lock(String entityName, Object object, LockMode lockMode) {
+ throw new UnsupportedOperationException();
+ }
+
public List<Object> list(CriteriaId criteriaId) {
throw new UnsupportedOperationException();
}
@@ -100,6 +130,18 @@
throw new UnsupportedOperationException();
}
+ public void persist(String entityName, Object obj) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void refresh(Object object) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void refresh(Object object, LockMode lockMode) {
+ throw new UnsupportedOperationException();
+ }
+
public void saveOrUpdate(Object obj) {
throw new UnsupportedOperationException();
}
@@ -124,6 +166,14 @@
throw new UnsupportedOperationException();
}
+ public LockMode getCurrentLockMode(Object object) {
+ throw new UnsupportedOperationException();
+ }
+
+ public String getEntityName(Object object) {
+ throw new UnsupportedOperationException();
+ }
+
public Set<ShardId> getShardIds() {
throw new UnsupportedOperationException();
}
Modified: trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java
===================================================================
--- trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java 2007-05-08 00:51:04 UTC (rev 11477)
+++ trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java 2007-05-08 00:58:54 UTC (rev 11478)
@@ -28,21 +28,8 @@
import org.hibernate.shards.ShardId;
import org.hibernate.shards.integration.BaseShardingIntegrationTestCase;
import org.hibernate.shards.integration.MemoryLeakPlugger;
-import static org.hibernate.shards.integration.model.ModelDataFactory.building;
-import static org.hibernate.shards.integration.model.ModelDataFactory.elevator;
-import static org.hibernate.shards.integration.model.ModelDataFactory.escalator;
-import static org.hibernate.shards.integration.model.ModelDataFactory.floor;
-import static org.hibernate.shards.integration.model.ModelDataFactory.office;
-import static org.hibernate.shards.integration.model.ModelDataFactory.person;
-import static org.hibernate.shards.integration.model.ModelDataFactory.tenant;
-import static org.hibernate.shards.integration.model.ModelDataFactory.window;
-import org.hibernate.shards.model.Building;
-import org.hibernate.shards.model.Escalator;
-import org.hibernate.shards.model.Floor;
-import org.hibernate.shards.model.Office;
-import org.hibernate.shards.model.Person;
-import org.hibernate.shards.model.Tenant;
-import org.hibernate.shards.model.Window;
+import static org.hibernate.shards.integration.model.ModelDataFactory.*;
+import org.hibernate.shards.model.*;
import org.hibernate.shards.session.ShardedSessionFactory;
import org.hibernate.shards.session.ShardedSessionImpl;
import org.hibernate.shards.session.SubsetShardedSessionFactoryImpl;
@@ -182,7 +169,6 @@
floor(b, 23);
session.saveOrUpdate(b);
commitAndResetSession();
- session.beginTransaction();
b = reload(b);
b.setName("b2");
session.saveOrUpdate(b);
@@ -878,6 +864,68 @@
assertEquals("a different name", b.getName());
}
+ public void testLoad() {
+ session.beginTransaction();
+ Building b = building("b1");
+ session.save(b);
+ commitAndResetSession();
+ Building loadedB = (Building) session.load(b.getClass(), b.getBuildingId());
+ assertNotNull(loadedB);
+ assertEquals("b1", loadedB.getName());
+ }
+
+ public void testLoadIntoObject() {
+ session.beginTransaction();
+ Building b = building("b1");
+ session.save(b);
+ commitAndResetSession();
+ Building loadedB = new Building();
+ session.load(loadedB, b.getBuildingId());
+ assertNotNull(loadedB);
+ assertEquals("b1", loadedB.getName());
+ }
+
+ public void testLoadNonexisting() {
+ session.beginTransaction();
+ Building b = building("b1");
+ session.save(b);
+ commitAndResetSession();
+ b = reload(b);
+ Serializable id = b.getBuildingId();
+ session.delete(b);
+ commitAndResetSession();
+ try {
+ Building loadedB = (Building)session.load(Building.class, id);
+ loadedB.getName();
+ fail();
+ } catch (HibernateException he) {
+ // good
+ }
+ }
+
+ public void testPersist() {
+ session.beginTransaction();
+ Building b = building("b1");
+ session.persist(b);
+ commitAndResetSession();
+ Building returnedB = (Building) session.get(b.getClass(), b.getBuildingId());
+ assertNotNull(returnedB);
+ assertEquals("b1", returnedB.getName());
+ }
+
+ public void testRefresh() {
+ session.beginTransaction();
+ Building b = building("b1");
+ session.save(b);
+ commitAndResetSession();
+ Building reloadedB = reload(b);
+ reloadedB.setName("b2");
+ commitAndResetSession();
+ assertEquals("b1", b.getName());
+ session.refresh(b);
+ assertEquals("b2", b.getName());
+ }
+
// calling update on a nonexistent entity should result in an exception
public void testUpdateOfNonexistentEntity() {
session.beginTransaction();
16 years, 12 months
Hibernate SVN: r11476 - trunk/HibernateExt/search/src/java/org/hibernate/search.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2007-05-07 20:29:40 -0400 (Mon, 07 May 2007)
New Revision: 11476
Modified:
trunk/HibernateExt/search/src/java/org/hibernate/search/Version.java
Log:
version check
Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/Version.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/Version.java 2007-05-07 05:53:05 UTC (rev 11475)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/Version.java 2007-05-08 00:29:40 UTC (rev 11476)
@@ -1,6 +1,8 @@
//$Id: $
package org.hibernate.search;
+import java.util.Date;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -8,7 +10,7 @@
* @author Emmanuel Bernard
*/
public class Version {
- public static final String VERSION = "3.0.0.Beta1";
+ public static final String VERSION = "3.0.0.Beta2-SNAPSHOT" + new Date();
private static Log log = LogFactory.getLog( Version.class );
static {
16 years, 12 months
Hibernate SVN: r11475 - in trunk/HibernateExt/shards/src: test/org/hibernate/shards/integration/model and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: max.ross
Date: 2007-05-07 01:53:05 -0400 (Mon, 07 May 2007)
New Revision: 11475
Modified:
trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java
trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java
Log:
http://opensource.atlassian.com/projects/hibernate/browse/HSHARDS-24
http://opensource.atlassian.com/projects/hibernate/browse/HSHARDS-25
Implemented ShardedSessionImpl.lock (both overloads)
A little bit of refactoring too.
Modified: trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java
===================================================================
--- trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java 2007-05-07 05:03:55 UTC (rev 11474)
+++ trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java 2007-05-07 05:53:05 UTC (rev 11475)
@@ -937,19 +937,25 @@
applyDeleteOperation(op, object);
}
- /**
- * Unsupported. This is a scope decision, not a technical decision.
- */
- public void lock(Object object, LockMode lockMode) throws HibernateException {
- throw new UnsupportedOperationException();
+ public void lock(final Object object, final LockMode lockMode) throws HibernateException {
+ SessionOperation<Void> op = new SessionOperation<Void>() {
+ public Void apply(Session session) {
+ session.lock(object, lockMode);
+ return null;
+ }
+ };
+ invokeSessionOperationOnSessionWithObject(op, object);
}
- /**
- * Unsupported. This is a scope decision, not a technical decision.
- */
- public void lock(String entityName, Object object, LockMode lockMode)
+ public void lock(final String entityName, final Object object, final LockMode lockMode)
throws HibernateException {
- throw new UnsupportedOperationException();
+ SessionOperation<Void> op = new SessionOperation<Void>() {
+ public Void apply(Session session) {
+ session.lock(entityName, object, lockMode);
+ return null;
+ }
+ };
+ invokeSessionOperationOnSessionWithObject(op, object);
}
/**
@@ -968,12 +974,12 @@
}
public LockMode getCurrentLockMode(final Object object) throws HibernateException {
- SessionMethodInvoker<LockMode> invoker = new SessionMethodInvoker<LockMode>() {
- public LockMode invoke(Session s, Object obj) {
+ SessionOperation<LockMode> invoker = new SessionOperation<LockMode>() {
+ public LockMode apply(Session s) {
return s.getCurrentLockMode(object);
}
};
- return invokeOnSessionWithObject(invoker, object);
+ return invokeSessionOperationOnSessionWithObject(invoker, object);
}
public Transaction beginTransaction() throws HibernateException {
@@ -1061,38 +1067,13 @@
}
}
- private interface SessionMethodInvoker<T> {
- T invoke(Session s, Object obj);
- }
-
- /**
- * Helper method we can use when we need to find the Session with which a
- * specified object is associated and invoke the method on that Session.
- * If the object isn't associated with a Session we just invoke it on a
- * random Session with the expectation that this will cause an error.
- */
- <T> T invokeOnSessionWithObject(SessionMethodInvoker<T> smi, Object object) throws HibernateException {
- ShardId shardId = getShardIdForObject(object);
- Session sessionToUse;
- if (shardId == null) {
- // just ask this question of a random shard so we get the proper error
- sessionToUse = getSomeSession();
- if (sessionToUse == null) {
- sessionToUse = shards.get(0).establishSession();
- }
- } else {
- sessionToUse = shardIdsToShards.get(shardId).establishSession();
- }
- return smi.invoke(sessionToUse, object);
- }
-
public String getEntityName(final Object object) throws HibernateException {
- SessionMethodInvoker<String> invoker = new SessionMethodInvoker<String>() {
- public String invoke(Session s, Object obj) {
+ SessionOperation<String> invoker = new SessionOperation<String>() {
+ public String apply(Session s) {
return s.getEntityName(object);
}
};
- return invokeOnSessionWithObject(invoker, object);
+ return invokeSessionOperationOnSessionWithObject(invoker, object);
}
public Filter enableFilter(String filterName) {
@@ -1461,4 +1442,29 @@
currentSubgraphShardId.set(shardId);
}
+ private interface SessionOperation<T> {
+ T apply(Session session);
+ }
+
+ /**
+ * Helper method we can use when we need to find the Session with which a
+ * specified object is associated and invoke the method on that Session.
+ * If the object isn't associated with a Session we just invoke it on a
+ * random Session with the expectation that this will cause an error.
+ */
+ <T> T invokeSessionOperationOnSessionWithObject(SessionOperation<T> sessionOperation, Object object) throws HibernateException {
+ ShardId shardId = getShardIdForObject(object);
+ Session sessionToUse;
+ if (shardId == null) {
+ // just ask this question of a random shard so we get the proper error
+ sessionToUse = getSomeSession();
+ if (sessionToUse == null) {
+ sessionToUse = shards.get(0).establishSession();
+ }
+ } else {
+ sessionToUse = shardIdsToShards.get(shardId).establishSession();
+ }
+ return sessionOperation.apply(sessionToUse);
+ }
+
}
Modified: trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java
===================================================================
--- trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java 2007-05-07 05:03:55 UTC (rev 11474)
+++ trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java 2007-05-07 05:53:05 UTC (rev 11475)
@@ -955,6 +955,22 @@
assertEquals(LockMode.WRITE, session.getCurrentLockMode(b));
}
+ public void testLock() {
+ session.beginTransaction();
+ Building b = building("b1");
+ try {
+ session.lock(b, LockMode.READ);
+ fail("expected he");
+ } catch (HibernateException he) {
+ // good
+ }
+ session.save(b);
+ commitAndResetSession();
+ b = reload(b);
+ session.lock(b, LockMode.UPGRADE);
+ assertEquals(LockMode.UPGRADE, session.getCurrentLockMode(b));
+ }
+
// this is a really good way to shake out synchronization bugs
public void xtestOverAndOver() throws Exception {
final boolean[] go = {true};
16 years, 12 months
Hibernate SVN: r11474 - in trunk/HibernateExt/shards/src: test/org/hibernate/shards/integration/model and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: max.ross
Date: 2007-05-07 01:03:55 -0400 (Mon, 07 May 2007)
New Revision: 11474
Modified:
trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java
trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java
Log:
http://opensource.atlassian.com/projects/hibernate/browse/HSHARDS-31
Implemented ShardedSessionImpl.getEntityName()
Modified: trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java
===================================================================
--- trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java 2007-05-07 04:13:58 UTC (rev 11473)
+++ trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java 2007-05-07 05:03:55 UTC (rev 11474)
@@ -967,19 +967,13 @@
throw new UnsupportedOperationException();
}
- public LockMode getCurrentLockMode(Object object) throws HibernateException {
- ShardId shardId = getShardIdForObject(object);
- Session sessionToUse;
- if (shardId == null) {
- // just ask this question of a random shard so we get the proper error
- sessionToUse = getSomeSession();
- if (sessionToUse == null) {
- sessionToUse = shards.get(0).establishSession();
+ public LockMode getCurrentLockMode(final Object object) throws HibernateException {
+ SessionMethodInvoker<LockMode> invoker = new SessionMethodInvoker<LockMode>() {
+ public LockMode invoke(Session s, Object obj) {
+ return s.getCurrentLockMode(object);
}
- } else {
- sessionToUse = shardIdsToShards.get(shardId).establishSession();
- }
- return sessionToUse.getCurrentLockMode(object);
+ };
+ return invokeOnSessionWithObject(invoker, object);
}
public Transaction beginTransaction() throws HibernateException {
@@ -1067,13 +1061,40 @@
}
}
+ private interface SessionMethodInvoker<T> {
+ T invoke(Session s, Object obj);
+ }
+
/**
- * Unsupported. This is a scope decision, not a technical decision.
+ * Helper method we can use when we need to find the Session with which a
+ * specified object is associated and invoke the method on that Session.
+ * If the object isn't associated with a Session we just invoke it on a
+ * random Session with the expectation that this will cause an error.
*/
- public String getEntityName(Object object) throws HibernateException {
- throw new UnsupportedOperationException();
+ <T> T invokeOnSessionWithObject(SessionMethodInvoker<T> smi, Object object) throws HibernateException {
+ ShardId shardId = getShardIdForObject(object);
+ Session sessionToUse;
+ if (shardId == null) {
+ // just ask this question of a random shard so we get the proper error
+ sessionToUse = getSomeSession();
+ if (sessionToUse == null) {
+ sessionToUse = shards.get(0).establishSession();
+ }
+ } else {
+ sessionToUse = shardIdsToShards.get(shardId).establishSession();
+ }
+ return smi.invoke(sessionToUse, object);
}
+ public String getEntityName(final Object object) throws HibernateException {
+ SessionMethodInvoker<String> invoker = new SessionMethodInvoker<String>() {
+ public String invoke(Session s, Object obj) {
+ return s.getEntityName(object);
+ }
+ };
+ return invokeOnSessionWithObject(invoker, object);
+ }
+
public Filter enableFilter(String filterName) {
EnableFilterOpenSessionEvent event = new EnableFilterOpenSessionEvent(
filterName);
Modified: trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java
===================================================================
--- trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java 2007-05-07 04:13:58 UTC (rev 11473)
+++ trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java 2007-05-07 05:03:55 UTC (rev 11474)
@@ -930,6 +930,18 @@
assertNull(b);
}
+ public void testGetEntityName() {
+ Building b = building("b1");
+ try {
+ session.getEntityName(b);
+ fail("expected he");
+ } catch (HibernateException he) {
+ // good
+ }
+ session.save(b);
+ assertEquals(Building.class.getName(), session.getEntityName(b));
+ }
+
public void testGetCurrentLockMode() {
session.beginTransaction();
Building b = building("b1");
16 years, 12 months
Hibernate SVN: r11473 - in trunk/HibernateExt/shards/src: test/org/hibernate/shards/integration/model and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: max.ross
Date: 2007-05-07 00:13:58 -0400 (Mon, 07 May 2007)
New Revision: 11473
Modified:
trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java
trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java
Log:
http://opensource.atlassian.com/projects/hibernate/browse/HSHARDS-28
Implemented ShardedSessionImpl.getCurrentLockMode()
Modified: trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java
===================================================================
--- trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java 2007-05-07 00:30:03 UTC (rev 11472)
+++ trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java 2007-05-07 04:13:58 UTC (rev 11473)
@@ -967,11 +967,19 @@
throw new UnsupportedOperationException();
}
- /**
- * Unsupported. This is a scope decision, not a technical decision.
- */
public LockMode getCurrentLockMode(Object object) throws HibernateException {
- throw new UnsupportedOperationException();
+ ShardId shardId = getShardIdForObject(object);
+ Session sessionToUse;
+ if (shardId == null) {
+ // just ask this question of a random shard so we get the proper error
+ sessionToUse = getSomeSession();
+ if (sessionToUse == null) {
+ sessionToUse = shards.get(0).establishSession();
+ }
+ } else {
+ sessionToUse = shardIdsToShards.get(shardId).establishSession();
+ }
+ return sessionToUse.getCurrentLockMode(object);
}
public Transaction beginTransaction() throws HibernateException {
Modified: trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java
===================================================================
--- trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java 2007-05-07 00:30:03 UTC (rev 11472)
+++ trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java 2007-05-07 04:13:58 UTC (rev 11473)
@@ -19,6 +19,7 @@
package org.hibernate.shards.integration.model;
import org.hibernate.HibernateException;
+import org.hibernate.LockMode;
import org.hibernate.SessionFactory;
import org.hibernate.TransactionException;
import org.hibernate.classic.Session;
@@ -929,6 +930,19 @@
assertNull(b);
}
+ public void testGetCurrentLockMode() {
+ session.beginTransaction();
+ Building b = building("b1");
+ try {
+ session.getCurrentLockMode(b);
+ fail("expected he");
+ } catch (HibernateException he) {
+ // good
+ }
+ session.save(b);
+ assertEquals(LockMode.WRITE, session.getCurrentLockMode(b));
+ }
+
// this is a really good way to shake out synchronization bugs
public void xtestOverAndOver() throws Exception {
final boolean[] go = {true};
16 years, 12 months
Hibernate SVN: r11472 - in trunk/HibernateExt/shards/src: test/org/hibernate/shards/integration/model and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: max.ross
Date: 2007-05-06 20:30:03 -0400 (Sun, 06 May 2007)
New Revision: 11472
Modified:
trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java
trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelIntegrationTest.java
trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java
Log:
Fix NPE when trying to update an object that doesn't already exist. Also modified code so that the user gets the same type of exception they'd get if they weren't using shards.
Modified: trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java
===================================================================
--- trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java 2007-05-06 21:50:41 UTC (rev 11471)
+++ trunk/HibernateExt/shards/src/java/org/hibernate/shards/session/ShardedSessionImpl.java 2007-05-07 00:30:03 UTC (rev 11472)
@@ -32,7 +32,6 @@
import org.hibernate.ReplicationMode;
import org.hibernate.SQLQuery;
import org.hibernate.SessionException;
-import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.TransientObjectException;
import org.hibernate.classic.Session;
@@ -400,7 +399,7 @@
return someSession.getCacheMode();
}
- public SessionFactory getSessionFactory() {
+ public ShardedSessionFactoryImplementor getSessionFactory() {
return shardedSessionFactory;
}
@@ -800,9 +799,25 @@
* The only safe way to perform the update is to load the object and then
* do a merge.
*/
- Object persistent = get(object.getClass(), extractId(object));
- shardId = getShardIdForObject(persistent);
- op.merge(shardIdsToShards.get(shardId), object);
+ Serializable id = extractId(object);
+ if(id != null) {
+ Object persistent = get(object.getClass(), extractId(object));
+ if(persistent != null) {
+ shardId = getShardIdForObject(persistent);
+ }
+ }
+ if(shardId == null) {
+ /**
+ * This is an error condition. In order to provide the same behavior
+ * as a non-sharded session we're just going to dispatch the update
+ * to a random shard (we know it will fail because either we don't have
+ * an id or the lookup returned).
+ */
+ op.update(getShards().get(0), object);
+ // this call may succeed but the commit will fail
+ } else {
+ op.merge(shardIdsToShards.get(shardId), object);
+ }
}
public void update(Object object) throws HibernateException {
Modified: trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelIntegrationTest.java
===================================================================
--- trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelIntegrationTest.java 2007-05-06 21:50:41 UTC (rev 11471)
+++ trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelIntegrationTest.java 2007-05-07 00:30:03 UTC (rev 11472)
@@ -17,6 +17,7 @@
*/
package org.hibernate.shards.integration.model;
+import org.hibernate.HibernateException;
import org.hibernate.shards.integration.BaseShardingIntegrationTestCase;
import org.hibernate.shards.model.IdIsBaseType;
@@ -45,4 +46,22 @@
assertNotNull(hli);
}
+ public void testUpdateIdIsBasetype() {
+ IdIsBaseType hli = new IdIsBaseType();
+ session.beginTransaction();
+ hli.setValue("yamma");
+ session.update(hli);
+ try {
+ session.getTransaction().commit();
+ fail("expected he");
+ } catch (HibernateException he) {
+ // good
+ }
+ resetSession();
+ session.beginTransaction();
+ session.saveOrUpdate(hli);
+ commitAndResetSession();
+ hli = reload(hli);
+ assertNotNull(hli);
+ }
}
Modified: trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java
===================================================================
--- trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java 2007-05-06 21:50:41 UTC (rev 11471)
+++ trunk/HibernateExt/shards/src/test/org/hibernate/shards/integration/model/ModelPermutedIntegrationTest.java 2007-05-07 00:30:03 UTC (rev 11472)
@@ -877,6 +877,32 @@
assertEquals("a different name", b.getName());
}
+ // calling update on a nonexistent entity should result in an exception
+ public void testUpdateOfNonexistentEntity() {
+ session.beginTransaction();
+ Building b = building("b1");
+ try {
+ session.update(b);
+ fail("expected HE");
+ } catch (HibernateException he) {
+ // good
+ }
+ resetSession();
+ session.beginTransaction();
+ // now we assign an id and try the same thing (calling save will assign)
+ session.save(b);
+ session.getTransaction().rollback();
+ resetSession();
+ session.beginTransaction();
+ session.update(b);
+ try {
+ session.getTransaction().commit();
+ fail("expected he");
+ } catch (HibernateException he) {
+ // good
+ }
+ }
+
public void testDeleteOfAttachedEntity() {
session.beginTransaction();
Building b = building("b1");
16 years, 12 months
Hibernate SVN: r11471 - trunk/HibernateExt/shards/doc/reference/en/modules.
by hibernate-commits@lists.jboss.org
Author: max.ross
Date: 2007-05-06 17:50:41 -0400 (Sun, 06 May 2007)
New Revision: 11471
Modified:
trunk/HibernateExt/shards/doc/reference/en/modules/configuration.xml
Log:
Fix doc bug http://opensource.atlassian.com/projects/hibernate/browse/HSHARDS-10
Mapping for sharded version of WeatherReport now matches non-sharded version of WeatherReport.
Modified: trunk/HibernateExt/shards/doc/reference/en/modules/configuration.xml
===================================================================
--- trunk/HibernateExt/shards/doc/reference/en/modules/configuration.xml 2007-05-06 21:47:18 UTC (rev 11470)
+++ trunk/HibernateExt/shards/doc/reference/en/modules/configuration.xml 2007-05-06 21:50:41 UTC (rev 11471)
@@ -251,8 +251,9 @@
<id name="reportId" column="REPORT_ID" type="long">
<generator class="org.hibernate.shards.id.ShardedTableHiLoGenerator"/>
</id>
- <property name="country" column="COUNTRY"/>
- <property name="city" column="CITY"/>
+ <property name="continent" column="CONTINENT"/>
+ <property name="latitude" column="LATITUDE"/>
+ <property name="longitude" column="LONGITUDE"/>
<property name="temperature" column="TEMPERATURE"/>
<property name="reportTime" type="timestamp" column="REPORT_TIME"/>
</class>
17 years