You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2006/08/11 04:28:41 UTC
svn commit: r430627 - in /incubator/cayenne/main/trunk/core/cayenne-jpa/src:
main/java/org/apache/cayenne/jpa/ main/java/org/apache/cayenne/jpa/cspi/
test/java/org/apache/cayenne/jpa/
Author: aadamchik
Date: Thu Aug 10 19:28:41 2006
New Revision: 430627
URL: http://svn.apache.org/viewvc?rev=430627&view=rev
Log:
fixing resource local transactions - EntityManager.getTransaction() MUST return a transaction instance
Modified:
incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/JpaEntityManager.java
incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/JpaEntityManagerFactory.java
incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityManager.java
incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityTransaction.java
incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/JpaEntityManagerTest.java
incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/MockJpaEntityManager.java
incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/MockJpaEntityManagerFactory.java
Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/JpaEntityManager.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/JpaEntityManager.java?rev=430627&r1=430626&r2=430627&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/JpaEntityManager.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/JpaEntityManager.java Thu Aug 10 19:28:41 2006
@@ -17,11 +17,9 @@
* under the License.
****************************************************************/
-
package org.apache.cayenne.jpa;
import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityNotFoundException;
import javax.persistence.EntityTransaction;
import javax.persistence.FlushModeType;
@@ -29,6 +27,7 @@
import javax.persistence.PersistenceException;
import javax.persistence.Query;
import javax.persistence.TransactionRequiredException;
+import javax.persistence.spi.PersistenceUnitTransactionType;
/**
* Base implementation of a non-JTA EntityManager.
@@ -39,7 +38,7 @@
protected PersistenceContextType contextType;
protected FlushModeType flushMode;
- protected EntityManagerFactory factory;
+ protected JpaEntityManagerFactory factory;
protected EntityTransaction transaction;
protected boolean open;
protected Object delegate;
@@ -47,7 +46,12 @@
/**
* Creates a new JpaEntityManager, initializing it with a parent factory.
*/
- public JpaEntityManager(EntityManagerFactory factory) {
+ public JpaEntityManager(JpaEntityManagerFactory factory) {
+
+ if (factory == null) {
+ throw new IllegalArgumentException("Null entity manager factory");
+ }
+
this.factory = factory;
this.open = true;
}
@@ -328,20 +332,27 @@
* used serially to begin and commit multiple transactions.
*
* @return EntityTransaction instance
- * @throws IllegalStateException if invoked on a JTA EntityManager or an EntityManager
- * that has been closed.
+ * @throws IllegalStateException if invoked on a JTA EntityManager.
*/
public EntityTransaction getTransaction() {
- checkClosed();
+ // note - allowed to be called on a closed EM
- return transaction;
- }
+ if (factory.getUnitInfo().getTransactionType() == PersistenceUnitTransactionType.JTA) {
+ throw new IllegalStateException(
+ "'getTransaction' is called on a JTA EntityManager");
+ }
- public void setTransaction(EntityTransaction transaction) {
- checkClosed();
+ if (transaction == null) {
+ this.transaction = createResourceLocalTransaction();
+ }
- this.transaction = transaction;
+ return transaction;
}
+
+ /**
+ * A method that creates a new resource-local transaction.
+ */
+ protected abstract EntityTransaction createResourceLocalTransaction();
/**
* Indicates to the EntityManager that a JTA transaction is active. This method should
Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/JpaEntityManagerFactory.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/JpaEntityManagerFactory.java?rev=430627&r1=430626&r2=430627&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/JpaEntityManagerFactory.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/JpaEntityManagerFactory.java Thu Aug 10 19:28:41 2006
@@ -17,7 +17,6 @@
* under the License.
****************************************************************/
-
package org.apache.cayenne.jpa;
import java.util.Collections;
@@ -108,5 +107,12 @@
*/
public void setDelegate(Object delegate) {
this.delegate = delegate;
+ }
+
+ /**
+ * Returns PersistenceUnitInfo used by this factory.
+ */
+ PersistenceUnitInfo getUnitInfo() {
+ return unitInfo;
}
}
Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityManager.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityManager.java?rev=430627&r1=430626&r2=430627&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityManager.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityManager.java Thu Aug 10 19:28:41 2006
@@ -17,12 +17,11 @@
* under the License.
****************************************************************/
-
package org.apache.cayenne.jpa.cspi;
import java.util.Map;
-import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceException;
import javax.persistence.Query;
@@ -31,16 +30,23 @@
import org.apache.cayenne.DataObjectUtils;
import org.apache.cayenne.Persistent;
import org.apache.cayenne.access.DataContext;
+import org.apache.cayenne.access.Transaction;
import org.apache.cayenne.jpa.JpaEntityManager;
+import org.apache.cayenne.jpa.JpaEntityManagerFactory;
public class CjpaEntityManager extends JpaEntityManager {
private DataContext context;
- public CjpaEntityManager(DataContext context, EntityManagerFactory factory,
+ public CjpaEntityManager(DataContext context, JpaEntityManagerFactory factory,
Map parameters) {
super(factory);
this.context = context;
+ }
+
+ @Override
+ protected EntityTransaction createResourceLocalTransaction() {
+ return new CjpaEntityTransaction(Transaction.internalTransaction(null));
}
@Override
Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityTransaction.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityTransaction.java?rev=430627&r1=430626&r2=430627&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityTransaction.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/cspi/CjpaEntityTransaction.java Thu Aug 10 19:28:41 2006
@@ -16,8 +16,6 @@
* specific language governing permissions and limitations
* under the License.
****************************************************************/
-
-
package org.apache.cayenne.jpa.cspi;
import java.sql.SQLException;
@@ -29,9 +27,9 @@
import org.apache.cayenne.access.Transaction;
/**
- * A JPA wrapper around a cayenne Transaction
+ * A JPA wrapper around a Cayenne Transaction.
*
- * @see http://objectstyle.org/confluence/display/CAYDOC/Understanding+Transactions
+ * @see http://cwiki.apache.org/CAYDOC/understanding-transactions.html
*/
public class CjpaEntityTransaction implements EntityTransaction {
Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/JpaEntityManagerTest.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/JpaEntityManagerTest.java?rev=430627&r1=430626&r2=430627&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/JpaEntityManagerTest.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/JpaEntityManagerTest.java Thu Aug 10 19:28:41 2006
@@ -17,23 +17,38 @@
* under the License.
****************************************************************/
-
package org.apache.cayenne.jpa;
+import javax.persistence.EntityTransaction;
import javax.persistence.FlushModeType;
import junit.framework.TestCase;
+import org.apache.cayenne.jpa.spi.MockPersistenceUnitInfo;
+
public class JpaEntityManagerTest extends TestCase {
public void testOpenClose() throws Exception {
- JpaEntityManager m = new MockJpaEntityManager(new MockEntityManagerFactory() {
+ JpaEntityManagerFactory factory = new MockJpaEntityManagerFactory() {
@Override
public boolean isOpen() {
return true;
}
- });
+ };
+ JpaEntityManager m = new MockJpaEntityManager(factory) {
+
+ @Override
+ protected EntityTransaction createResourceLocalTransaction() {
+ return new MockEntityTransaction() {
+
+ @Override
+ public boolean isActive() {
+ return true;
+ }
+ };
+ }
+ };
assertTrue(m.isOpen());
@@ -84,23 +99,32 @@
}
public void testCloseActiveTransactionInProgress() {
- JpaEntityManager m = new MockJpaEntityManager(new MockEntityManagerFactory() {
+ JpaEntityManagerFactory factory = new MockJpaEntityManagerFactory() {
@Override
public boolean isOpen() {
return true;
}
- });
-
- assertTrue(m.isOpen());
+ };
- m.setTransaction(new MockEntityTransaction() {
+ JpaEntityManager m = new MockJpaEntityManager(factory) {
@Override
- public boolean isActive() {
- return true;
+ protected EntityTransaction createResourceLocalTransaction() {
+ return new MockEntityTransaction() {
+
+ @Override
+ public boolean isActive() {
+ return true;
+ }
+ };
}
- });
+ };
+
+ assertTrue(m.isOpen());
+
+ // make sure we trigger transaction creation
+ assertNotNull(m.getTransaction());
try {
m.close();
@@ -114,18 +138,19 @@
public void testCloseFactoryClosed() {
final boolean[] factoryCloseState = new boolean[1];
- JpaEntityManager m = new MockJpaEntityManager(new MockEntityManagerFactory() {
+ JpaEntityManagerFactory factory = new MockJpaEntityManagerFactory(
+ new MockPersistenceUnitInfo()) {
@Override
public boolean isOpen() {
return !factoryCloseState[0];
}
- });
+ };
- assertTrue(m.isOpen());
+ JpaEntityManager m = new MockJpaEntityManager(factory);
+ assertTrue(m.isOpen());
factoryCloseState[0] = true;
-
assertFalse(m.isOpen());
}
}
Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/MockJpaEntityManager.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/MockJpaEntityManager.java?rev=430627&r1=430626&r2=430627&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/MockJpaEntityManager.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/MockJpaEntityManager.java Thu Aug 10 19:28:41 2006
@@ -20,13 +20,18 @@
package org.apache.cayenne.jpa;
-import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
import javax.persistence.Query;
public class MockJpaEntityManager extends JpaEntityManager {
- public MockJpaEntityManager(EntityManagerFactory factory) {
+ public MockJpaEntityManager(JpaEntityManagerFactory factory) {
super(factory);
+ }
+
+ @Override
+ protected EntityTransaction createResourceLocalTransaction() {
+ return null;
}
@Override
Modified: incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/MockJpaEntityManagerFactory.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/MockJpaEntityManagerFactory.java?rev=430627&r1=430626&r2=430627&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/MockJpaEntityManagerFactory.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/MockJpaEntityManagerFactory.java Thu Aug 10 19:28:41 2006
@@ -17,7 +17,6 @@
* under the License.
****************************************************************/
-
package org.apache.cayenne.jpa;
import java.util.Map;
@@ -25,8 +24,14 @@
import javax.persistence.EntityManager;
import javax.persistence.spi.PersistenceUnitInfo;
+import org.apache.cayenne.jpa.spi.MockPersistenceUnitInfo;
+
public class MockJpaEntityManagerFactory extends JpaEntityManagerFactory {
+ public MockJpaEntityManagerFactory() {
+ this(new MockPersistenceUnitInfo());
+ }
+
public MockJpaEntityManagerFactory(PersistenceUnitInfo unitInfo) {
super(unitInfo);
}
@@ -35,5 +40,4 @@
protected EntityManager createEntityManagerInternal(Map parameters) {
return null;
}
-
}