jsr338-experts@jpa-spec.java.net

[jsr338-experts] Inheritance of Extended Persistence Context

From: Scott Marlow <smarlow_at_redhat.com>
Date: Fri, 01 Jun 2012 11:50:11 -0400

In the interest of ensuring EE application portability, I'd like to
change or add additional wording to the JPA 2.1 "7.6.3.1 Inheritance of
Extended Persistence Context" section.

In the following example, instances of beans TestSFSB, DAO1, DAO2 will
be "executing in the same EJB container instance" (PostConstruct for {
TestSFSB, DAO1, DAO2} should execute in the same EJB container
instance). One question that I have, is there a possibility for {
TestSFSB DAO1, DAO2} to not execute in the same EJB container instance?
  Is that EJB container implementation specific?

@Stateful
@Remote(TestService.class)
public class TestSFSB implements TestService {
     private EntityManager entityManager;

     @EJB(beanName = "DAO1") private DAO dao1;
     @EJB(beanName = "DAO2") private DAO dao2;

     public String testfunc() {
         dao1.myFunction();
         dao2.myFunction();
         return "fine";
     }
}

@Stateful
public class DAO1 implements DAO {
     @PersistenceContext(type=PersistenceContextType.EXTENDED)
     private EntityManager entityManager;

     public void myFunction() {
         entityManager.find(PersonOrm.class, 123L);
         System.out.println("DAO1:" + entityManager);
     }
}

@Stateful
public class DAO2 implements DAO {
     @PersistenceContext(type=PersistenceContextType.EXTENDED)
     private EntityManager entityManager;

     public void myFunction() {
         entityManager.find(PersonOrm.class, 123L);
         System.out.println("DAO2:" + entityManager);
     }
}


Text from the JPA 2.0 specification:

"
7.6.2.1 Inheritance of Extended Persistence Context

If a stateful session bean instantiates a stateful session bean
(executing in the same EJB container instance) which also has such an
extended persistence context, the extended persistence context of the
first stateful session bean is inherited by the second stateful session
bean and bound to it, and this rule recursively applies—independently of
whether transactions are active or not at the point of the creation of
the stateful session beans.
"

Text from the JPA 2.1 specification:

"
7.6.3.1 Inheritance of Extended Persistence Context
If a stateful session bean instantiates a stateful session bean
(executing in the same EJB container instance) which also has such an
extended persistence context with the same synchronization type, the
extended persistence context of the first stateful session bean is
inherited by the second stateful session bean and bound to it, and this
rule recursively applies—independently of whether transactions are
active or not at the point of the creation of the stateful session
beans. If the stateful session beans differ in declared synchronization
type, the EJBException is thrown by the container.
"

Depending on the answer to my first question, I'd like to add clarifying
text (to the JPA 2.1 7.6.3.1 section) that makes it more obvious whether
DAO1 + DAO2 (which could execute in the same EJB container) will inherit
the same extended persistence context. I'll try to make some
suggestions after we have answered these questions as to whether DAO1 +
DAO2 will always execute in the same EJB container.

Scott