[ 
https://issues.apache.org/jira/browse/CAY-1725?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Aaron Andersen updated CAY-1725:
--------------------------------

    Description: 
I am using Cayenne version 3.0.1.

In CayenneModeler I have created an "Approver" DbEntity and a "Department" 
DbEntity (as well as the corresponding ObjEntity classes). I have also created 
an "Authorization" DbEntity to act as a join table for the Approver and 
Department tables. Every Approver object has a list of Department objects 
associated with it, and vice versa so in CayenneModeler I have added a 
"departmentArray" relationship to the Approver object which has "to many, list" 
semantics.

When I use the Approver method "void addToDepartmentArray (Department)" 
everything works fine, but when I use the Approver method "void 
removeFromDepartmentArray (Department)" (which simple calls removeToManyTarget) 
a NullPointerException is thrown. A backtrace and quick debug tells me the null 
pointer exception originates from:

org.apache.cayenne.access.DataDomainFlattenedBucket.addFlattenedDelete(DataDomainFlattenedBucket.java:82)

The code on lines 81 and 82 of this file are as follows:

[81] List flattenedSnapshots = 
flattenedDeleteInfo.buildJoinSnapshotsForDelete(node);
[82] if (!flattenedSnapshots.isEmpty()) {

Inspecting flattenedSnapshots on line 82 shows that flattenedSnapshots is null 
hence accessing the isEmpty method is causing the null pointer exception.

I have also tested with Cayenne 3.0.2 and the same error occurs.

Here is a simple code snippet to reproduce this error:

// make sure our context is clear of any changes
context.rollbackChanges ();

// set up a new approver and department
Approver approver = context.newObject (Approver.class);
Department dept = context.newObject (Department.class);

approver.setLogin ("approver");
dept.setName ("departmentA");

// add the department to the approver
approver.addToDepartmentArray (dept);

// commit these to the database, so far everything should be running fine
context.commitChanges ();

// remove the department from the approver... 
// this should work fine because we haven't committed yet
approver.removeFromDepartmentArray (dept);

try {

    // this is where things go bad
    context.commitChanges ();

} catch (Exception e) {

    // error has occurred
    // at this point the record in the Authorization table still exists

}

  was:
I am using Cayenne version 3.0.1.

In CayenneModeler I have created an "Approver" DbEntity and a "Department" 
DbEntity (as well as the corresponding ObjEntity classes). I have also created 
an "Authorization" DbEntity to act as a join table for the Approver and 
Department tables. Every Approver object has a list of Department objects 
associated with it, and vice versa so in CayenneModeler I have added a 
"departmentArray" relationship to the Approver object which has "to many, list" 
semantics.

When I use the Approver method "void addToDepartmentArray (Department)" 
everything works fine, but when I use the Approver method "void 
removeFromDepartmentArray (Department)" (which simple calls removeToManyTarget) 
a NullPointerException is thrown. A backtrace and quick debug tells me the null 
pointer exception originates from:

org.apache.cayenne.access.DataDomainFlattenedBucket.addFlattenedDelete(DataDomainFlattenedBucket.java:82)

The code on lines 81 and 82 of this file are as follows:

[81] List flattenedSnapshots = 
flattenedDeleteInfo.buildJoinSnapshotsForDelete(node);
[82] if (!flattenedSnapshots.isEmpty()) {

Inspecting flattenedSnapshots on line 82 shows that flattenedSnapshots is null 
hence accessing the isEmpty method is causing the null pointer exception.

I have also tested with Cayenne 3.0.2 and the same error occurs.

    
> NullPointerException from call to removeToManyTarget
> ----------------------------------------------------
>
>                 Key: CAY-1725
>                 URL: https://issues.apache.org/jira/browse/CAY-1725
>             Project: Cayenne
>          Issue Type: Bug
>          Components: Core Library
>    Affects Versions: 3.0.1, 3.0.2
>            Reporter: Aaron Andersen
>         Attachments: KeysDomainNode.driver.xml, KeysMap.map.xml, cayenne.xml
>
>
> I am using Cayenne version 3.0.1.
> In CayenneModeler I have created an "Approver" DbEntity and a "Department" 
> DbEntity (as well as the corresponding ObjEntity classes). I have also 
> created an "Authorization" DbEntity to act as a join table for the Approver 
> and Department tables. Every Approver object has a list of Department objects 
> associated with it, and vice versa so in CayenneModeler I have added a 
> "departmentArray" relationship to the Approver object which has "to many, 
> list" semantics.
> When I use the Approver method "void addToDepartmentArray (Department)" 
> everything works fine, but when I use the Approver method "void 
> removeFromDepartmentArray (Department)" (which simple calls 
> removeToManyTarget) a NullPointerException is thrown. A backtrace and quick 
> debug tells me the null pointer exception originates from:
> org.apache.cayenne.access.DataDomainFlattenedBucket.addFlattenedDelete(DataDomainFlattenedBucket.java:82)
> The code on lines 81 and 82 of this file are as follows:
> [81] List flattenedSnapshots = 
> flattenedDeleteInfo.buildJoinSnapshotsForDelete(node);
> [82] if (!flattenedSnapshots.isEmpty()) {
> Inspecting flattenedSnapshots on line 82 shows that flattenedSnapshots is 
> null hence accessing the isEmpty method is causing the null pointer exception.
> I have also tested with Cayenne 3.0.2 and the same error occurs.
> Here is a simple code snippet to reproduce this error:
> // make sure our context is clear of any changes
> context.rollbackChanges ();
> // set up a new approver and department
> Approver approver = context.newObject (Approver.class);
> Department dept = context.newObject (Department.class);
> approver.setLogin ("approver");
> dept.setName ("departmentA");
> // add the department to the approver
> approver.addToDepartmentArray (dept);
> // commit these to the database, so far everything should be running fine
> context.commitChanges ();
> // remove the department from the approver... 
> // this should work fine because we haven't committed yet
> approver.removeFromDepartmentArray (dept);
> try {
>     // this is where things go bad
>     context.commitChanges ();
> } catch (Exception e) {
>     // error has occurred
>     // at this point the record in the Authorization table still exists
> }

--
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