3 Replies Latest reply on Aug 15, 2007 12:39 AM by norman.richards

    extended persistence context with JavaBeans ?

    sirandreus

      Hi,

      How can I enable an extended persistence context using JavaBeans ? (without EJB).

      I could not manage not get it work. Please read on in order to understand the problem.

      Im using Seam with the following configuration:
      - Seam 2.0 Beta1
      - JBoss AS 4.2.1
      - JavaBeans (without EJB)
      - created Project using seam-gen as a war (not ear)

      In the Seam book "Simplicity and Power beyond JEE" the author says that the persistence context of all Seam POJOs is extended.

      In order to make sure, that this is true, I´ve ported the Clickable Lists example (from the official Tutorial := http://docs.jboss.org/seam/latest-2.0/reference/en/html/tutorial.html#messages) into the JavaBeans Model. The only differences are:

      1) no @Statefull Annotation at the MessageManagerBean class
      2) added @Transactional at MessageManagerBean class (as a class level annotation, so that every method is made trasactional)
      3) instad of @PersistenceContext, I use @In

      The problem is, that the PersistenceContext is not extended as expected. For example, after calling the "select" method, a database update does "not" happen.

       public void select() {
       message.setRead(true);
       }
      


      However if I replace the implementation with the following code, everything is fine (update happens):

       @Transactional
       public void select() {
       Message mergedMessage = entityManager.merge(message);
       mergedMessage.setRead(true);
      
       //message.setRead(true);
       }
      


      The only logical explanation is that the PersistenceContext is not extended. Because if it was, the original select implementation should synchronize the state of the object with the database (and thus making an update).


      thanks for your help,
      Andreas

        • 1. Re: extended persistence context with JavaBeans ?

          The lifecycle of an EJB3 extended persistence context is tied to the lifecycle of the bean that is using it. Seam allows you to use a bean with an extended persistence context, but it doesn't provide an extended persistence context to anything. Instead, the seam-managed persistence context is scoped to the conversation. Are both requests happening in the same conversation or are they separate conversations?

          • 2. Re: extended persistence context with JavaBeans ?
            sirandreus

            hi norman,

            thank you for your quick help.

            The requests happened inside a Session Scope, but (if I understand correctly) still in different conversations. Thus I added a @Begin annotation at the factory method, which is called once, when the page is loaded.

            I haven´t annotated any method with @End. However, if the Session ends, will the Conversation end as well ? Will the persistence context be cleared as well ?

            Here is the code: (the Message class and the xhtml code is like in the original tutorial)

            @Name("messageManager")
            @Scope(ScopeType.SESSION)
            @Transactional
            public class MessageManager {
            
             @DataModel
             private List<Message> messageList;
            
             @DataModelSelection
             @Out(required = false)
             private Message message;
            
             @In
             private EntityManager entityManager;
            
             @Logger
             private Log logger;
            
             @Begin
             @Factory("messageList")
             public void findMessages() {
            
             Message m1 = new Message("T1");
             m1.setTitle("T1");
             m1.setText("text1");
             m1.setDatetime(new Date());
            
             Message m2 = new Message("T2");
             m2.setTitle("T2");
             m2.setText("text2");
             m2.setDatetime(new Date());
            
             Message m3 = new Message("T3");
             m3.setTitle("T3");
             m3.setText("text3");
             m3.setDatetime(new Date());
            
             entityManager.persist(m1);
             entityManager.persist(m2);
             entityManager.persist(m3);
            
             this.messageList = entityManager.createQuery("from Message").getResultList();
             logger.info("messageList initialized");
             }
            
             public void select() {
             message.setRead(true);
             }
            
             public void delete() {
             entityManager.remove(message);
            
             messageList.remove(message);
             message = null;
             }
            
            }
            
            
            



            thank you,
            Andreas

            • 3. Re: extended persistence context with JavaBeans ?

              If the session ends, all conversations in the session end. You'll need to verify that your conversation is being propagated. If it is, and you are still not seeing the correct persistence context behavior, then we can look and see where the problem might be.