Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
3.0.1, 3.0.2
-
None
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 }Attachments
Attachments
Issue Links
- is related to
-
CAY-1689 [PATCH] LOB*QueryBuilders do not check isQuotingSQLIdentifiers
- Closed