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

        

Reply via email to