users@jpa-spec.java.net

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

From: Carlo de Wolf <cdewolf_at_redhat.com>
Date: Tue, 19 Jun 2012 09:58:44 +0200

IMHO the XPC must be shared top-level.

@Stateful
public class MyStatefulService {

     @EJB
     FirstDAO firstDAO;

     @EJB
     SecondDAO secondDAO;

     @PostConstruct
     public void doSomething() {
         // Must not fail!
         // Fail!
         assertTrue(firstDAO.loadItem() == secondDAO.loadItem());
     }

     @Remove
     public void endConversation() {
     }
}


To extend Christian's example a bit, put a @PostConstruct on doSomething().

This is a perfectly legal construct by EJB standards, yet it would fail
because of "broken" ;-) JPA XPC inheritance implementations.

Carlo

On 06/18/2012 11:34 PM, Linda DeMichiel wrote:
> Hi Emmanuel, all,
>
> On 6/4/2012 2:58 AM, Emmanuel Bernard wrote:
>> Hey all,
>>
>> I am of the opinion that both DAOs should share the same persistence
>> context as they are both wrapped in the same Stateful SessionBean. Is
>> there any reason why we should purposely not propagate the same
>> persistence context?
>>
>> While I understand the propagation and the reasoning, I do think that
>> it "makes sense" for implementors and is sound but nevertheless miss
>> the ease if use and practical test especially for beginners.
>>
>> It would be much easier for people to understand that SFSB sharing
>> the same life cycle owner (the top SFSB in practice) share the same
>> persistence context.
>> PC propagation and inheritance is quite complex to grasp despite the
>> fact that we designed it to improve ease-of-use. I wonder if we can
>> make it easier for people.
>>
>> Sure, the "fix" is one line of code, namely add the @PC to the root
>> SFSB but the behavior is surprising and more than one beginner falls
>> into the trap of not adding it and end up using 2 PC with at best
>> performance issues and worse case, hard to understand identity breaks.
>>
>> Christian has expressed my opinion with stronger words but fairly
>> aligned with my ideas
>> http://4thline.org/articles/Stateful%20persistence%20context%20propagation%20in%20JPA.html
>>
>
> OK, but this would be an incompatible change, which I don't think we
> should contemplate. Depending on further
> input from developers on this issue, we could consider whether
> addressing the use case by means of additional
> metadata would be beneficial.
>
> -Linda
>
>> Emmanuel
>>
>> On 1 juin 2012, at 20:40, 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
>>>>>>>>
>>>>>>>>
>>>>>
>>>>
>>