users@jpa-spec.java.net

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

From: michael keith <michael.keith_at_oracle.com>
Date: Fri, 01 Jun 2012 14:40:30 -0400

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
>>>>>
>>>>>
>>
>