Re: JPA events for cmp and JPA testing

From: Craig L Russell (Craig.Russel..un.COM)
Date: Sun Feb 04 2007 - 15:11:06 EST

  • Next message: Kevin Menard: "RE: CAY-597?"

    Hi Andrus,

    On Feb 4, 2007, at 8:37 AM, Andrus Adamchik wrote:

    > Hi Dain,
    >
    > Just got some time to write a JPA/OpenEJB integration test
    > following your example. Everything works except for one thing. Here
    > is my sample code:
    >
    > GeronimoTransactionManagerJTA11 tm = new
    > GeronimoTransactionManagerJTA11();
    > System.setProperty(
    > Context.INITIAL_CONTEXT_FACTORY,
    > LocalInitialContextFactory.class.getName());
    >
    > new InitialContext().bind("java:comp/
    > TransactionSynchronizationRegistry", tm);
    >
    > EntityManagerFactory factory = ... // init code for Cayenne
    > JTA EMF
    > JtaEntityManagerRegistry registry = new
    > JtaEntityManagerRegistry(tm);
    >
    > tm.begin();
    >
    > EntityManager entityManager = new JtaEntityManager(
    > registry,
    > factory,
    > new Properties(),
    > false);
    >
    >
    > SimpleEntity e = new SimpleEntity();
    > e.setProperty1("XXX");
    > entityManager.persist(e);
    > tm.commit(); // Nothing is saved to the DB here
    >
    > Now the problem...
    >
    > According to the JPA spec, ch. 5.9.2, "When
    > EntityManagerFactory.createEntityManager is invoked, the provider
    > must create and return a new entity manager. If a JTA transaction
    > is active, the provider must register for synchronization
    > notifications against the JTA transaction."
    >
    > So that's what Cayenne EMF does [1], [2] via
    > TransactionSynchronizationRegistry.registerInterposedSynchronization
    > (..). At a later time OpenEJB JtaEntityManager calls the same
    > method on the registry to register a its own close operation,
    > kicking out Cayenne EM callback. The end result is that the
    > EntityManager is not flushed in "beforeCompletion" and nothing is
    > saved to DB.
    >
    > I suspect Geronimo TransactionImpl is to blame here. It only allows
    > a single interposed synchronization. Is it a requirement of the JTA
    > spec?

    The intent of the registerInterposedSynchronization method is to
    allow any number of callbacks to be registered for synchronization.

    It's a bug if only one is allowed. There is no requirement for any
    particular ordering among the callbacks but multiple callbacks are
    required to be supported.

    Craig

    > (if it is, I couldn't find any mention of it). If everyone agrees
    > with my assessment of the situation, I can submit a patch.
    >
    > Thoughts?
    >
    > Andrus
    >
    >
    > [1] https://svn.apache.org/repos/asf/cayenne/main/trunk/framework/
    > cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/
    > JtaEntityManagerFactory.java
    > [2] https://svn.apache.org/repos/asf/cayenne/main/trunk/framework/
    > cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/
    > JtaEntityManager.java
    >
    >
    > On Jan 11, 2007, at 10:34 PM, Dain Sundstrom wrote:
    >
    >> I just committed the JtaEntityManager and JtaEntityManagerRegistry
    >> to the openejb-persistence module. You can create a
    >> JtaEntityManager with the following code:
    >>
    >> JtaEntityManagerRegistry registry = new JtaEntityManagerRegistry
    >> (transactionSynchronizationRegistry);
    >> EntityManager entityManager = new JtaEntityManager(registry,
    >> entityManagerFactory,
    >> properties,
    >> extended);
    >>
    >> That's it. The under the covers of the JtaEntityManager a new
    >> EntityManager instance is created using the EMF for each transaction.
    >>
    >> A single instance of the JtaEntityManagerRegistry should be
    >> shared by all JtaEntityManagers. TransactionSynchronization
    >> registry is a new interface in JTA 1.1. The Geronimo JTA 1.1
    >> transaction manager implements this interface directly, but if you
    >> are not using that transaction manager just wrap your transaction
    >> manager with the openejb SimpleTransactionSynchronizationRegistry.
    >>
    >> If you want to test extended entity managers (only used by
    >> stateful session beans), you will need to simulate stateful
    >> session bean construction, entrance, exit and starting of user
    >> transactions by call in the appropriate method on the
    >> JtaEntityManagerRegistry.
    >>
    >> If you run into problems, don't hesitate to ask.
    >>
    >> -dain
    >>
    >

    Craig Russell
    Architect, Sun Java Enterprise System http://java.sun.com/products/jdo
    408 276-5638 mailto:Craig.Russel..un.com
    P.S. A good JDO? O, Gasp!





    This archive was generated by hypermail 2.0.0 : Sun Feb 04 2007 - 15:11:49 EST