jsr338-experts@jpa-spec.java.net

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

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

I understand that is one possible implementation and point of view. Is
there something that I missed in my reading of the current 7.6.3.1
wording that requires that?

Since both bean instances are in the same EJB container instance, does
that also qualify for inheritance (from the current wording).

I would of expected that portable applications, that want a separate
extended persistence context would instead reference different
persistence unit names:

@PersistenceContext(unitName="OrderEM")
public class MySessionBean implements M

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

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


On 06/01/2012 02:40 PM, michael keith wrote:
> Right, once the persistence context is removed from the parent SFSB then
> there is nothing to inherit :-)
>
> On 01/06/2012 2:09 PM, Linda DeMichiel wrote:
>> There should be two distinct persistence contexts.
>>
>> On 6/1/2012 10:15 AM, Scott Marlow wrote:
>>>
>>> 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
>>>>>>
>>>>>>
>>>
>>