[jboss-user] [Persistence, JBoss/CMP, Hibernate, Database] - the never ending flow of optimistic locking questions

beligum do-not-reply at jboss.com
Tue Jun 19 06:42:48 EDT 2007


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:

anonymous wrote : 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

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4055537#4055537

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4055537



More information about the jboss-user mailing list