Hi Alex, it's a bug when running in managed environments. I will fix this as soon as possible. After the fix cast Transaction to TransactionExt, a new introduced interface for proprietary extensions of the odmg-Transaction interface.
regards, Armin ----- Original Message ----- From: "Bates, Alex" <[EMAIL PROTECTED]> To: "OJB Users List" <[EMAIL PROTECTED]> Sent: Friday, August 08, 2003 11:19 PM Subject: RE: OJB uses jdbc cursor to Update - but my cursor doesn't suppor t up date! > > Okay, I tried a couple ways but I must be doing something wrong. I'm using > rc4, and I'm getting a ClassCastException when I try to cast to > TransactionImpl because the instance is actually a NarrowTransaction > > 14:16:36,217 INFO [STDOUT] query: yyyyyyyyyyyyyy select bonus; > 14:16:36,217 INFO [STDOUT] tx: > [EMAIL PROTECTED] > 14:16:36,217 ERROR [STDERR] java.lang.ClassCastException > > Any idea why the txn is a NarrowTransaction as opposed to a TransactionImpl, > or how to change? > > Thx, > > Alex > > > > -----Original Message----- > From: Bates, Alex > Sent: Friday, August 08, 2003 11:34 AM > To: OJB Users List > Subject: RE: OJB uses jdbc cursor to Update - but my cursor doesn't suppor t > up date! > > > > Thanks Thomas! Will give this a try! > > -----Original Message----- > From: Thomas Mahler [mailto:[EMAIL PROTECTED] > Sent: Friday, August 08, 2003 11:25 AM > To: OJB Users List > Subject: Re: OJB uses jdbc cursor to Update - but my cursor doesn't suppor t > up date! > > > Hi Alex, > > Bates, Alex wrote: > > Hi Thomas, > > > > Hmmm, so it doesn't use updatable cursors. So OJB is not recognizing > > that an update has taken place. When I call ODMG's > > Transaction.lock(obj, Transaction.WRITE), how does it determine if an > > update has taken place? In my app, the servlet tier gets a Vector of > > O/R mapped objects from the EJB tier, updates a given object, then > > calls the EJB tier updateObject() method to update it. Is there a > > problem with this? I noticed in your ODMG examples you explicitly > > lock an object before calling the update methods - but I assumed it > > was different in an EJB-based app. > > > > Q: is there a problem with this scenario? > > Yes! ODMG has no notion of long transactions. that is ODMG want's you to > perform all changes to object after locking them to the transactions. > > So changing objects on the client, then sending them back to the server > and locking them to a transaction will fail! > > That's because the ODMG transaction manager was not able to track the > state of that object. > > The trick is as Follows: > > After locking the changed object from the client call: > ((o.a.ojb.odmg.TransactionImpl) tx).markDirty(instance); > > > > > *servlet app retrieves O/R mapped object via EJB layer (which uses > > ODMG), but object is not locked (optimistic) *servlet calls setter > > methods on the object *servlet calls EJB updateObject method, which > > calls Transaction.lock > > > > Q2: do I need to put an explicit READ lock on a retrieved list of > > objects returned by the EJB tier? > > Yes, that would be another option. But it would mean to keep the ODMG tx > open during the client operations. And when the client returns the > changes object you have to looup the proper transaction. > > cheers, > Thomas > > > > > > > Details: > > > > > > Here is my app's architecture: > > > > *OJB: uses the ODMG API w/in Jboss 3.2.1 > > > > *EJB tier: uses a PersistenceManagerBean SessionBean w/ insert, > > update, delete methods; the implementation of the update methods are > > as follows > > > > /** > > * Store object that has been mapped in OJB repository > > * @param obj > > * > > * @ejb:interface-method > > */ > > public Object updateObject(Object obj) throws DataAccessException > > { > > > > return storeObject(obj); > > } > > > > /** > > */ > > public Object storeObject(Object obj) throws DataAccessException > > { > > try > > { > > if(log.isDebugEnabled()) log.debug("storeObject"); > > > > Transaction tx = odmg.currentTransaction(); > > tx.lock(obj, Transaction.WRITE); > > } > > catch (Throwable t) > > { > > t.printStackTrace(); > > System.out.println(t.getMessage()); > > } > > return obj; > > } > > > > Here is the method used to retrieve a list for the servlet tier: > > /** > > * @ejb:interface-method > > */ > > public Vector getVector(Class klass) throws DataAccessException { > > > > Vector result = null; > > try { > > > > OQLQuery query = odmg.newOQLQuery(); > > query.create("select allObjects from " + klass.getName()); > > DList list = (DList) query.execute(); > > > > result = new Vector(); > > Object[] vals = list.toArray(); > > for (int i=0; i<list.size(); i++) { > > // Retrieve associated CLOB > > if (klass.newInstance() instanceof ClobVOInterface) > > { > > ClobVOInterface vo = (ClobVOInterface)list.get(i); > > retrieveClob((ClobVOInterface)vo); > > } > > > > result.add(list.get(i)); > > } > > > > } catch (Throwable t) { > > t.printStackTrace(); > > } > > > > return result; > > } > > > > *DAO: > > DAO used by servlet tier to perform updates/retrieval (servlet doesn't > > directly access PM), w/ following code: > > > > public class DefaultDAO implements DAOInterface { > > > > public void updateVO(VOInterface obj) throws DataAccessException { > > PersistenceManagerRemote pm = > > ServiceLocator.getInstance().getPersistenceManager(); > > try { > > pm.updateObject(obj); > > } catch (DataAccessException e) { > > e.printStackTrace(); > > } catch (RemoteException e) { > > e.printStackTrace(); > > } > > } > > > > public Vector getAllVO(Class klass, ACL acl) throws > > DataAccessException { > > PersistenceManagerRemote pm = > > ServiceLocator.getInstance().getPersistenceManager(); > > try { > > return pm.getVector(klass, acl); > > } catch (DataAccessException e) { > > e.printStackTrace(); > > } catch (RemoteException e) { > > e.printStackTrace(); > > } > > > > return null; > > } > > > > > > > > *Servlet tier: > > Uses DAO method to retrieve list of objects; then has edit form that > > allows user to edit; here's the servlet update code > > > > QueryVO query = (QueryVO)component; > > query.setLabel(validator.getUIValue("label")); > > query.setSql(validator.getUIValue("sql")); > > query.setMaxRows(validator.getUIValueAsInt("maxRows")); > > > > query.setQueryTimeoutSecs(validator.getUIValueAsInt("queryTimeoutSecs" > > )); > > > > > > DAOFactory.getDAO(DefaultDAO.class.getName()).updateVO(component, > > acl); > > > > > > -----Original Message----- > > From: Thomas Mahler [mailto:[EMAIL PROTECTED] > > Sent: Thursday, August 07, 2003 11:08 PM > > To: OJB Users List > > Subject: Re: OJB uses jdbc cursor to Update - but my cursor doesn't > support > > up date! > > > > > > Hi Alex > > > > Bates, Alex wrote: > > > >>Hello, > >> > >>I've isolated the root cause of my problem. But turning debugging on, > >>I saw all the SQL OJB was generating in my JBoss log file. > >> > >>OJB generates SQL for SELECT and INSERT. But for UPDATE, no SQL is > >>generated - it assumes it has an Updatable Cursor. But my driver > >>cursor does not support update. > > > > > > OJB does not use Updatable Cursors. > > Using UC would mean to have a cursor opened between read and the > > final > > broker.store() call. We don't do this to avoid problems with opened > > resources and because only a few JDBC drivers properly support this > feature. > > > > SO if there are no UPDATE statements generated it must be caused by > > something else. > > > > are you using the ODMG API or the PB API? > > Please provide the code section where you don't get UPDATES generated. > > > > cheers, > > Thomas > > > > > >>Q: How do I tell OJB to use SQL to update instead of updating through > >>a Cursor? I tried setting JDBC level to 1.0 in > >>repository_database.xml, but this didn't work. > >> > >>Thanks in advance! > >> > >>Alex > >> > >>--------------------------------------------------------------------- > >>To unsubscribe, e-mail: [EMAIL PROTECTED] > >>For additional commands, e-mail: [EMAIL PROTECTED] > >> > >> > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
