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 11:09:23 -0700

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