users@jpa-spec.java.net

[jpa-spec users] [jsr338-experts] Re: Inheritance of Extended Persistence Context

From: Scott Marlow <smarlow_at_redhat.com>
Date: Fri, 01 Jun 2012 13:15:59 -0400

On 06/01/2012 12:47 PM, Linda DeMichiel wrote:
>
>
> On 6/1/2012 9:25 AM, michael keith wrote:
>> Assuming the DAO interface is local and does not have a @Remote on it,
>> and also assuming that there is just a forgotten
>> injection annotation of
>> @PersistenceContext(type=PersistenceContextType.EXTENDED) on the EM in
>> TestService, then the PC
>> should be inherited by both SFSBs DAO1 and DAO2. If the session beans
>> are local then you should not leave the EJB
>> container instance.
>> (Does that answer the question?)
>>
>
> Yes, agree.
>
> Scott, was TestService intended to have a transaction-scoped or an
> extended persistence context?

For the purpose of this question, lets remove the entity manager from
TestService. I should of removed that before.


@Stateful
@Remote(TestService.class)
public class TestSFSB implements TestService {

     @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);
     }
}

>
>
>> On 01/06/2012 11:50 AM, Scott Marlow wrote:
>>> 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
>>>
>>>