jsr338-experts@jpa-spec.java.net

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

From: Linda DeMichiel <linda.demichiel_at_oracle.com>
Date: Mon, 18 Jun 2012 14:36:24 -0700

On 6/7/2012 6:07 AM, Scott Marlow wrote:
> On 06/01/2012 03:53 PM, Linda DeMichiel wrote:
>>
>>
>> On 6/1/2012 12:01 PM, Scott Marlow wrote:
>>> 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?
>>>
>>
>> The extended persistence context is created when the SFSB is
>> instantiated (JPA spec 7.6.3).
>> The SFSB is created when it is injected (EJB spec 4.6).
>> Inheritance only applies when one SFSB instantiates another (JPA spec
>> 7.6.3.1)
>
> Does the XPC inheritance also apply to a SFSB doing a JNDI lookup of another local SFSB?

Yes

Is there a distinction on when
> the SFSB does the JNDI lookup?

No

If the JNDI lookup occurs before the first SFSB PostConstruct, that is probably easier to
> handle than (very late) during a business method invocation.
>
>>
>>> Since both bean instances are in the same EJB container instance, does
>>> that also qualify for inheritance (from the
>>> current wording).
>>>
>>
>> no
>>
>>> I would of expected that portable applications, that want a separate
>>> extended persistence context would instead
>>> reference different persistence unit names:
>>>
>>
>> That would definitely be the case as well.
>>
>>> @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
>>>>>>>>>
>>>>>>>>>
>>>>>>
>>>>>
>>>
>