import javax.transaction.UserTransaction;
import org.wamblee.general.ThreadSpecificProxyFactory;
+import org.wamblee.test.persistence.JpaBuilder;
/**
- * Simple transaction manager provides a simple mechanism to manage transaction
+ *
+ * <p>
+ * Simple transaction manager provides a simple mechanism to manage transactions
* in test code through the {@link UserTransaction} object.
+ * To construct the transaction manager use:
+ * </p>
+ * <pre>
+ * SimpleTransactionManager manager =
+ * new SimpleTransactionManager(new DefaultUserTransactionFactory());
+ * </pre>
+ *
+ * <p>
+ * Next, add resources to manage using {@link #addResource(TransactionResource)}:
+ * <pre>
+ * manager.addResource(jpaTester.getJpaBuilder());
+ * </pre>
+ * <p>
+ * As you can see from the above, {@link JpaBuilder} is a resource that can be used
+ * so this mechanism can be used with JPA testing.
+ * </p>
+ *
+ * <p>
+ * The next step is to manage transactions using the standard <code>UserTransaction</code>
+ * APIs:
+ * </p>
+ * <pre>
+ * UserTransaction transaction = manager.getTransaction();
+ * transaction.begin();
+ *
+ * ... do work...
+ *
+ * transaction.commit();
+ * </pre>
*
* @author Erik Brakkee
*
public class SimpleTransactionManager {
private UserTransactionFactory factory;
- private ThreadSpecificProxyFactory<UserTransaction> transaction;
+ private ThreadLocal<UserTransaction> transaction;
private UserTransactionCallback callback;
private List<TransactionResource> resources;
*/
public SimpleTransactionManager(UserTransactionFactory aFactory) {
factory = aFactory;
- transaction = new ThreadSpecificProxyFactory<UserTransaction>(UserTransaction.class);
+ transaction = new ThreadLocal<UserTransaction>();
callback = new UserTransactionCallback() {
@Override
* @return User transaction.
*/
public UserTransaction getTransaction() {
+ return new AutoCreateUserTransaction(this);
+ }
+
+ UserTransaction getOrCreateThreadSpecificTransaction() {
UserTransaction tx = transaction.get();
if (tx == null) {
tx = factory.create(callback, resources);
transaction.set(tx);
}
- return transaction.getProxy();
+ return tx;
}
/**