gdamour 2005/09/13 09:04:59
Modified: modules/core/src/java/org/openejb/entity/cmp/pkgenerator
SequenceTablePrimaryKeyGeneratorWrapper.java
Log:
GERONIMO-1004 SequenceTablePrimaryKeyGenerator transaction handling is broken
(Tranql)
As pointed out by David J, a TransactionManager needs to be passed to
SequenceTablePrimaryKeyGenerator in order to suspend and resume in-flight
transactions while retrieving the next ids.
Revision Changes Path
1.8 +11 -5
openejb/modules/core/src/java/org/openejb/entity/cmp/pkgenerator/SequenceTablePrimaryKeyGeneratorWrapper.java
Index: SequenceTablePrimaryKeyGeneratorWrapper.java
===================================================================
RCS file:
/home/projects/openejb/scm/openejb/modules/core/src/java/org/openejb/entity/cmp/pkgenerator/SequenceTablePrimaryKeyGeneratorWrapper.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- SequenceTablePrimaryKeyGeneratorWrapper.java 6 Mar 2005 02:49:38
-0000 1.7
+++ SequenceTablePrimaryKeyGeneratorWrapper.java 13 Sep 2005 13:04:59
-0000 1.8
@@ -48,6 +48,7 @@
package org.openejb.entity.cmp.pkgenerator;
import javax.sql.DataSource;
+import javax.transaction.TransactionManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -56,6 +57,7 @@
import org.apache.geronimo.gbean.GBeanInfoBuilder;
import org.apache.geronimo.gbean.GBeanLifecycle;
import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
+import org.apache.geronimo.transaction.context.TransactionContextManager;
import org.tranql.cache.CacheRow;
import org.tranql.cache.DuplicateIdentityException;
import org.tranql.cache.InTxCache;
@@ -71,14 +73,16 @@
*/
public class SequenceTablePrimaryKeyGeneratorWrapper implements
PrimaryKeyGenerator, GBeanLifecycle {
private static final Log log =
LogFactory.getLog(SequenceTablePrimaryKeyGeneratorWrapper.class);
-
+
+ private final TransactionContextManager transactionContextManager;
private final ManagedConnectionFactoryWrapper connectionFactoryWrapper;
private final String tableName;
private final String sequenceName;
private final int batchSize;
private SequenceTablePrimaryKeyGenerator delegate;
- public
SequenceTablePrimaryKeyGeneratorWrapper(ManagedConnectionFactoryWrapper
connectionFactoryWrapper, String tableName, String sequenceName, int batchSize)
{
+ public SequenceTablePrimaryKeyGeneratorWrapper(TransactionContextManager
transactionContextManager, ManagedConnectionFactoryWrapper
connectionFactoryWrapper, String tableName, String sequenceName, int batchSize)
{
+ this.transactionContextManager = transactionContextManager;
this.connectionFactoryWrapper = connectionFactoryWrapper;
this.tableName = tableName;
this.sequenceName = sequenceName;
@@ -87,7 +91,8 @@
public void doStart() throws Exception {
DataSource dataSource = (DataSource)
connectionFactoryWrapper.$getResource();
- delegate = new SequenceTablePrimaryKeyGenerator(dataSource,
tableName, sequenceName, batchSize);
+ TransactionManager tm =
transactionContextManager.getTransactionManager();
+ delegate = new SequenceTablePrimaryKeyGenerator(tm, dataSource,
tableName, sequenceName, batchSize);
delegate.initSequenceTable();
}
@@ -113,12 +118,13 @@
GBeanInfoBuilder infoFactory = new
GBeanInfoBuilder(SequenceTablePrimaryKeyGeneratorWrapper.class);
infoFactory.addInterface(PrimaryKeyGenerator.class);
+ infoFactory.addReference("TransactionContextManager",
TransactionContextManager.class, NameFactory.JTA_RESOURCE);
infoFactory.addReference("ManagedConnectionFactoryWrapper",
ManagedConnectionFactoryWrapper.class,
NameFactory.JCA_MANAGED_CONNECTION_FACTORY);
infoFactory.addAttribute("tableName", String.class, true);
infoFactory.addAttribute("sequenceName", String.class, true);
infoFactory.addAttribute("batchSize", int.class, true);
- infoFactory.setConstructor(new
String[]{"ManagedConnectionFactoryWrapper", "tableName", "sequenceName",
"batchSize"});
+ infoFactory.setConstructor(new String[]{"TransactionContextManager",
"ManagedConnectionFactoryWrapper", "tableName", "sequenceName", "batchSize"});
GBEAN_INFO = infoFactory.getBeanInfo();
}