[ https://issues.apache.org/jira/browse/OPENJPA-2095?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Heath Thomann resolved OPENJPA-2095. ------------------------------------ Resolution: Fixed Fix Version/s: 2.2.1 2.3.0 2.1.2 2.0.2 1.2.3 > Unhandled exception thrown from within an Externalizer method causes > incorrect/incomplete SQL to be generated/executed. > ----------------------------------------------------------------------------------------------------------------------- > > Key: OPENJPA-2095 > URL: https://issues.apache.org/jira/browse/OPENJPA-2095 > Project: OpenJPA > Issue Type: Bug > Components: sql > Affects Versions: 1.2.3, 2.0.2, 2.1.2, 2.2.0 > Reporter: Heath Thomann > Assignee: Heath Thomann > Fix For: 1.2.3, 2.0.2, 2.1.2, 2.3.0, 2.2.1 > > Attachments: ExternalizerTest.zip > > > I've re-created an issue with Externalizers. That is, when the Externalizer > method (i.e. the method listed in the @Externalizer) causes/throws an > exception, OpenJPA generates, and executes, incorrect/incomplete SQL. To > better explain, let me describe some test code snippets which are from the > test I'll provide. First, take this entity: > @Entity > public class TestItem implements Serializable { > ..... > @org.apache.openjpa.persistence.Persistent > @org.apache.openjpa.persistence.Externalizer("check") > private TestExternal ext; > And take the following class TestExternal: > public static class TestExternal { > ..... > public String check() throws Exception { > throw new PersistenceException("test exception externalizer"); > With this code, lets look at the case where we persist a new TestItem, and > the case where we update an existing one. When we create a new TestItem and > persist it, OpenJPA generates and executes the following SQL: > INSERT INTO TESTITEM (data) VALUES (?) > However, this SQL should be generated: > INSERT INTO TESTITEM (iref, data, ext, name) VALUES (?, ?, ?, ?) > When we update an existing TestItem, OpenJPA generates, and executes, the > following SQL: > UPDATE TESTITEM SET data = ? > However, this SQL should be generated: > UPDATE TESTITEM SET data = ? WHERE iref = ? > Because an unhandled exception is thrown by the Externalizer method, the > transaction will be rolled back. However, if the SQL were to actually > commit, every row in TestItem would be updated with the value in 'data'. > Furthermore, in the case where there are hundreds/thousands of rows in the > DB, the execution of the SQL may take a long time to complete and will > maintain a lock on the TestItem table during the execution, possibly locking > out other clients. > I've included a simple test, named ExternalizerTest.zip, which demonstrates > the issue. > Thanks, > Heath -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira