(no commit message)
authorErik Brakkee <erik@brakkee.org>
Mon, 5 Jul 2010 14:17:51 +0000 (14:17 +0000)
committerErik Brakkee <erik@brakkee.org>
Mon, 5 Jul 2010 14:17:51 +0000 (14:17 +0000)
test/eclipselink/src/main/java/org/wamblee/support/persistence/eclipselink/EclipselinkJpaCustomizer.java
test/enterprise/src/main/java/org/wamblee/support/ThreadSpecificProxyFactory.java
test/enterprise/src/main/java/org/wamblee/support/persistence/PersistenceUnitDescription.java
test/enterprise/src/main/java/org/wamblee/support/persistence/TransactionProxyFactory.java
test/hibernate/src/main/java/org/wamblee/support/persistence/hibernate/HibernateJpaCustomizer.java
test/toplink-essentials/src/main/java/org/wamblee/support/persistence/toplink/ToplinkJpaCustomizer.java

index 1679942b15a6a9716152422fe292b517ef304180..b6fd991b237b09d2554dac239eed3283cf90d67b 100644 (file)
@@ -42,7 +42,7 @@ public class EclipselinkJpaCustomizer implements JpaCustomizer {
         Map<String, String> aJpaProperties) {
   
         // DDL generation
-        aJpaProperties.put("eclipselink.ddl-generation", "create-tables");
+        aJpaProperties.put("eclipselink.ddl-generation", "drop-and-create-tables");
         
         // DDL generation
         FileSystemUtils.createDir(new File("target/sql"));
index e47c037ac8f23e56086235c4758c8df7a759c2ad..02668cdc9cbb3cdfbf04437e5c2c32778b0d4543 100644 (file)
@@ -71,6 +71,14 @@ public class ThreadSpecificProxyFactory<T> {
     public void set(T aService) {
         svc.set(aService);
     }
+    
+    /**
+     * Gets the current thread-specific service. 
+     * @return Service. 
+     */
+    public T get() { 
+        return svc.get();
+    }
 
     /**
      * Gets the proxy that delegates to the thread-specific instance set by
index b6dc28bb3250cbcff950d94b88abb5837fb03969..4cd06d049a6d49a4e3f4e6c2ba4e98249f3506de 100644 (file)
@@ -17,12 +17,23 @@ package org.wamblee.support.persistence;
 
 import org.dbunit.dataset.filter.ITableFilterSimple;
 
+/**
+ * Describes a persistence unit. 
+ * 
+ * @author Erik Brakkee
+ */
 public class PersistenceUnitDescription {
 
     private String jndiName;
     private String unitName;
     private ITableFilterSimple tables;
 
+    /**
+     * Constructs the description. 
+     * @param aJndiName Jndi name. 
+     * @param aUnitName Persistence unit name. 
+     * @param aTables Tables to delete.
+     */
     public PersistenceUnitDescription(String aJndiName, String aUnitName,
         ITableFilterSimple aTables) {
         jndiName = aJndiName;
@@ -30,14 +41,24 @@ public class PersistenceUnitDescription {
         tables = aTables;
     }
 
+    /**
+     * @return JNDI name. 
+     */
     public String getJndiName() {
         return jndiName;
     }
 
+    /**
+     * Persistence unit name. 
+     */
     public String getUnitName() {
         return unitName;
     }
 
+    /**
+     * Tables to delete. 
+     * @return Tables. 
+     */
     public ITableFilterSimple getTables() {
         return tables;
     }
index e56d34fa78e7ea94b8c3020a810eb82205d004cb..548a3cdaebc1a8279ebaef779854807387925a99 100644 (file)
@@ -15,6 +15,7 @@
  */
 package org.wamblee.support.persistence;
 
+
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -27,11 +28,25 @@ import org.wamblee.support.persistence.JpaBuilder.JpaUnitOfWork;
 
 /**
  * This utility makes sure that each invocation on a certain interface is
- * carried out within a JPA unit of work.
+ * carried out within a JPA unit of work. Note that this is equivalent
+ * to the sementics of a requiresNew transaction attribute. 
  * 
  * Use {@link #getTransactionScopedEntityManager()} to get the transaction
  * scoped entity manager to pass to services.
  * 
+ * 
+ * For example: 
+ * <pre>
+ *     JpaBuilder builder = ...
+ *     TransactionProxyFactory<Service> factory = new TransactionProxyFactory<Service>(
+ *           builder, Service.class);
+ *     Service service = new JpaService(factory.getTransactionScopedEntityManager());
+ *     Service proxy = factory.getProxy(service);
+ *     proxy.executeMethod(...); 
+ * </pre>
+ * The above example executes the executeMethod() call on the service object within an active transaction.
+ * In the constructor of the service a transaction scoped entity manager is passed.  
+ * 
  * @param T
  *            Type of interface to proxy.
  * 
@@ -39,6 +54,13 @@ import org.wamblee.support.persistence.JpaBuilder.JpaUnitOfWork;
  */
 public class TransactionProxyFactory<T> {
 
+    /**
+     * Executes the call on the service within a new transaction.  
+     * 
+     * @author Erik Brakkee
+     *
+     * @param <T> Type of the service interface. 
+     */
     private class UnitOfWorkInvocationHandler<T> implements InvocationHandler {
 
         private T service;
@@ -54,6 +76,7 @@ public class TransactionProxyFactory<T> {
                 .execute(new JpaUnitOfWork<Object>() {
                     @Override
                     public Object execute(EntityManager aEm) throws Exception {
+                        EntityManager oldEm = ENTITY_MANAGER.get(); 
                         try {
                             ENTITY_MANAGER.set(aEm);
                             return aMethod.invoke(service, aArgs);
@@ -67,7 +90,7 @@ public class TransactionProxyFactory<T> {
                             // last resort.
                             throw new RuntimeException(e);
                         } finally {
-                            ENTITY_MANAGER.set(null);
+                            ENTITY_MANAGER.set(oldEm);
                         }
                     }
                 });
index 71bbb18c10028fd4c50583c941836816e477f9c9..923d0c225106793f4c5fb2a7fb99ffadf3633f93 100644 (file)
@@ -51,7 +51,7 @@ public class HibernateJpaCustomizer implements JpaCustomizer {
         System.setProperty("hibernate.connection.password", aJpaProperties.get("javax.persistence.jdbc.password"));
 
         // Hibernate schema generation
-        aJpaProperties.put("hibernate.hbm2ddl.auto", "create");
+        aJpaProperties.put("hibernate.hbm2ddl.auto", "create-drop");
     }
 
     @Override
index 1b3808f099cf07ff3c2c4f86eab53cb80dbd364a..da40441cd3de35cb2cef7818291c4e8975e24334 100644 (file)
@@ -46,7 +46,7 @@ public class ToplinkJpaCustomizer implements JpaCustomizer {
         aJpaProperties.put("toplink.jdbc.password", aJpaProperties.get("javax.persistence.jdbc.password"));
 
         // DDL generation for toplink
-        aJpaProperties.put("toplink.ddl-generation", "create-tables");
+        aJpaProperties.put("toplink.ddl-generation", "drop-and-create-tables");
         
         // DDL generation
         FileSystemUtils.createDir(new File("target/sql"));