[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