[
https://issues.apache.org/jira/browse/OPENJPA-2095?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Heath Thomann updated OPENJPA-2095:
-----------------------------------
Attachment: ExternalizerTest.zip
Test to reproduce the issue described in the description.
> Unhandled exception throw 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
> 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