jsr338-experts@jpa-spec.java.net

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

From: Scott Marlow <smarlow_at_redhat.com>
Date: Thu, 07 Jun 2012 09:07:06 -0400

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? Is there a distinction on when the SFSB does the
JNDI lookup? 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
>>>>>>>>
>>>>>>>>
>>>>>
>>>>
>>