[jboss-user] [EJB 3.0] - Re: problems with optimistic locking/persistence data in EJB

wiggy do-not-reply at jboss.com
Sun Jan 13 17:19:52 EST 2008


I'm thinking the same way - but dont know how to fix it!

the delete action updates the version number from the previous transaction.

               ----------
----          |   -----  |
|   |   ---> |  |     | |
-----         |  ------  |
                ----------

client         AS server and EJB server code 


  | ... container based delete action that updates the DB and increments the version i'ds on the DB .  Server code ...
  | 
  | @TransactionAttribute (TransactionAttributeType.REQUIRED)
  | 	public boolean removeLink (Node fromNode, Node remoteNode)
  | 	{
  | 		
  | 		List<Link> qres;
  | 		Logger log = Logger.getLogger("NodeEAOBean");
  | 		log.setLevel(org.apache.log4j.Level.DEBUG);
  | 
  | 		if (fromNode == null || remoteNode == null)
  | 		{
  | 			log.error("was passed a null reference");
  | 			return false;
  | 		}
  | 
  | 		fromNode = em.merge(fromNode); 
  | 		remoteNode = em.merge(remoteNode); 
  | 		Query q = em.createNamedQuery("findLinksBetweenNodes");
  | 		q.setParameter("toNode", remoteNode);
  | 		q.setParameter("fromNode", fromNode);
  | 		
  | 		log.debug("to node details " + remoteNode.getNodeName() + "\n");
  | 		
  | 		qres = (List<Link>)q.getResultList();
  | 		if (qres != null && qres.size () == 1)
  | 		{
  | 			Link link =  qres.get(0);
  | 			remoteNode.deleteLinkFrom(link);
  | 			fromNode.deleteLinkTo(link);
  | 			em.remove(link);
  | 			//fix?
  | 			em.flush();
  | 			return true;
  | 		}
  | 		else
  | 			{return false;}
  | 
  | 	}
  | 

however despite the merge actions and the end of the transaction completing ( i even put the flush in and it made no difference).  These changes dont get synced back to the application client (outside the container).

so how are you supposed to get the client back in sync ?  I tried a resync operation from the client like this 


  | ... client code - calls the remove link then tries to resynch with server
  | after the the above code has ompleted...
  | 
  | 			//local if (removeLink(uNode, zNode))
  | 			if (nodeEAO.removeLink(uNode, zNode))
  | 			{
  | 
  | 				System.out.println ("deleted link  : \n");
  | 			}
  | 
  | 			//update to latest version number
  | 			yNode = nodeEAO.refresh(uNode);
  | 

and this errors with the same optimistic lock exception 

on the EJB server side the refresh is implemented as 


  | ... generic EAO class code ... 
  | 
  |     public T refresh (T entity)
  |     {
  |     	entity = em.merge(entity);
  |     	em.refresh (entity);
  |     	return entity;
  |     }
  | 

I thought this was going to be enough to resync the client local copy to the extant version on the DB.  but the error still occurs.

How is this supposed to work ??? 

do i have to do a complete new findByID call and get a new reference from the client ?  seems a bit weird - surely there is a way to update a disconnected client copy with the changes on the EJB server?

should version managment be avoided (doesnt seem right).  If not just how the heck is this supposed to work.


thanks in advance if you can help



 


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

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



More information about the jboss-user mailing list