users@jpa-spec.java.net

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

From: Linda DeMichiel <linda.demichiel_at_oracle.com>
Date: Fri, 01 Jun 2012 09:47:04 -0700

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?


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