JPA 2.1 support, in particular for SynchronizationType.UNSYNCHRONIZED

In the course of this effort, our joinTransaction() support has been overhauled to work for shared EntityManagers as well, since an unsynchronized shared EntityManager will nevertheless be scoped for the current transaction but not automatically join it (as per the JPA 2.1 spec). In the JTA case, we'll simply create an unsynchronized target EntityManager and will upgrade it to a synchronized one (later in the same transaction, if necessary) through an implicit joinTransaction() call. In the JpaTransactionManager case, we'll unbind the primary target EntityManager and will expose an unsynchronized EntityManager instead, upgrading it the same way as with JTA, with the primary EntityManager in that case just serving as a vehicle for transaction begin/commit/rollback calls.

For extended EntityManagers, we've just added further combinations to the existing variants: application-managed EntityManagers which may nevertheless auto-join transactions (EntityManagerFactory.createEntityManager with SynchronizationType.SYNCHRONIZED), and container-managed EntityManagers which might opt for not auto-joining transactions (@PersistenceContext with synchronizationType=UNSYNCHRONIZED).

Issue: SPR-8194
This commit is contained in:
Juergen Hoeller
2013-03-27 14:43:26 +01:00
committed by unknown
parent a3d7dc09ef
commit ff160f9aeb
11 changed files with 376 additions and 112 deletions

View File

@@ -156,15 +156,6 @@ public abstract class AbstractContainerEntityManagerFactoryIntegrationTests
}
}
public void testSharedEntityManagerProxyRejectsProgrammaticTxJoining() {
try {
sharedEntityManager.joinTransaction();
fail("Should not be able to join transactions with container managed EntityManager");
}
catch (IllegalStateException ex) {
}
}
// public void testAspectJInjectionOfConfigurableEntity() {
// Person p = new Person();
// System.err.println(p);

View File

@@ -323,6 +323,16 @@ public class LocalContainerEntityManagerFactoryBeanTests extends AbstractEntityM
public ProviderUtil getProviderUtil() {
throw new UnsupportedOperationException();
}
@Override
public void generateSchema(PersistenceUnitInfo persistenceUnitInfo, Map map) {
throw new UnsupportedOperationException();
}
@Override
public boolean generateSchema(String persistenceUnitName, Map map) {
throw new UnsupportedOperationException();
}
}

View File

@@ -100,6 +100,16 @@ public class LocalEntityManagerFactoryBeanTests extends AbstractEntityManagerFac
public ProviderUtil getProviderUtil() {
throw new UnsupportedOperationException();
}
@Override
public void generateSchema(PersistenceUnitInfo persistenceUnitInfo, Map map) {
throw new UnsupportedOperationException();
}
@Override
public boolean generateSchema(String persistenceUnitName, Map map) {
throw new UnsupportedOperationException();
}
}
}