I have had this problem some time ago, too. In my opinion, there is no simple solution. So I wrote some code to save those new-flags and manually rolled them back on an error. A solutian I've worked on is to change the Transaction-class by adding non-static methods for commit and rollback and two methods adding Jobs for post-commit and post-rollback processing. Finally there should be a save-method in the transaction, wich delegates to a save-method of a Base-Object and which adds a new-Flag-false-Job to the commit-job-chain. If commit is called, it should commit all changes and, if no exception is thrown, the commit-job-chain should be processed. I've made an implementation after reading your mail, cause my companies code should not be contributed, as it contains too many specific changes. I'll append the code but it's not tested out now. It makes use of the fact that we are using BaseObjects which contain the save-Method (I think this is optional). Another way (my code doesn't exclude) is to add a save-Method which uses a Transaction-instance (this would be nice as the java.sql.Connection doesn't have to be used and won't appear in the app-code anymore).
In the code you sent in, there is another error. The line "isAlreadyInSave = false" will never be executed if some exception is thrown. This could be easily fixed with a try ... finally block in the template. Florian Fray ----- Original Message ----- From: <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Saturday, September 25, 2004 2:08 AM Subject: Torque BaseXXX in Transaction and the isNew() Method Check > Hi- > > 'm having a problem using Torque-generated classes within a transaction. > > Let's say I have a table, Person, for which Person.java and BasePerson.java > are generated by Torque. > > When I attempt to save my person instance for the first time, Torque will do > an insert and then set the new attribtue to false on my Person instance. > > public void save(Connection con) throws TorqueException > { > if (!alreadyInSave) > { > alreadyInSave = true; > > > > // If this object has been modified, then save it to the > database. > if (isModified()) > { > if (isNew()) > { > PersonPeer.doInsert((Person) this, con); > setNew(false); > } > else > { > PersonPeer.doUpdate((Person) this, con); > } > } > > alreadyInSave = false; > } > } > > Now, if I'm running in a transaction and the transaction rolls back due to > some application exception, once the user resolves the problem and attempts > to re-insert the Person instance, it will not be inserted. Instead, because > isNew() now returns false, Torque will attempt to update the record. > However, this record does not exist in the database since the initial > transaction rolled back. > > Has anyone come up with an elegant solution for this problem? > > Thanks. > > Michael > > > --------------------------------------------------------------------- > 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]