0 Replies Latest reply on Jun 19, 2007 6:49 AM by beligum

    the never ending flow of optimistic locking questions

    beligum

      Hi all,

      This question must be getting boresome to some of you experts here,
      but please help an intermediate developer along with some answers to a few simple questions regarding the subject.

      I use the @Version annotation in my EJB3 entity bean (Seam, JTA), and, while a user edits the bean-contents, it's possible the info is updated through a JMS-callback from an external source.

      Now, I would like to select a few (modified-behind-the-scenes) fields from the database, and let them precede the user-input whatsoever.

      So, when I call my entityManager.flush() method (Seam-managed em), it throws a StaleObjectStateException, because of the JMS-update. In this post (http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3919517#3919517), Gavin points out that it's possible to present the user with the changes made in the DB, by starting up a new context/transaction. He even points out how to do it, but in his own expert-style, the explanation is still quite cryptic to me.

      Can anyone elaborate on the:

      To "get" a new PC/txn to work with, call a session bean in the context of a REQUIRES_NEW transaction (if it is stateful, it needs to be a newly instantiated SFSB).


      This is my relevant code (a conversation-scoped SFSB in a long-running conversation/transaction):
      public String updateEntity()
      {
       ...
       try {
       entityManager.merge(getSelectedInode());
       entityManager.flush();
      
       return "success";
       }
       catch (OptimisticLockException e) {
       VersionConflictManager conflictManager = (VersionConflictManager)Component.getInstance("versionConflictManager");
       File dbFile = (File)conflictManager.getConflictingDbObject(File.class, getSelectedInode().getFileSystemEntity().getId());
       System.out.println("test");
       }
      }
      


      And here's my VersionConflictManager
      @Stateful
      @Scope(CONVERSATION)
      @Name("versionConflictManager")
      public class VersionConflictManager implements Serializable
      {
      
       //-----VARIABLES-----
       @In(create=true)
       EntityManager entityManager;
      
       //-----CONSTRUCTORS-----
       public VersionConflictManager()
       {
       }
      
       //-----GETTERS/SETTERS------
       @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
       public Object getConflictingDbObject(Class entityClass, int id)
       {
       return entityManager.find(entityClass, id);
       }
      
       @Remove
       @Destroy
       public void destroy()
       {
       }
      }
      


      Apparently, I'm missing something, because I get a StaleObjectStateException when I try to instantiate the VersionConflictManager in the catch-code.

      Any help is appreciated,

      bram

      PS: I'm cross-posting this from the Persistence,JBoss/CMP, Hibernate, ... forum, to raise my chances in getting a response (http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4055537#4055537), please forgive me my insolence