I'm a fan of well-named things ... deleteWithoutMercy and horribleMutantRuntimeWithoutRelationships are fabulous!
On Thu, May 30, 2019 at 6:44 AM Hugi Thordarson <h...@karlmenn.is> wrote: > Hi Jurgen, > > thanks for the suggestions :). I made a horrible hack just now, based on > the idea of having a different model, but instead of modifying files, I > remove the relationships in memory. This actually works but it would be > interesting to hear the point of view of others—am I potentially shooting > myself in the foot by firing up a copy of my ServerRuntime within the same > JVM, based on the same (but modified in memory) model? Any potential > conflicts? > > public void deleteWithoutMercy( final List<DataObject> objectsToDelete ) { > final ServerRuntime horribleMutantRuntimeWithoutRelationships = > NBCore.createServerRuntime( Props.defaultProps() ); > > horribleMutantRuntimeWithoutRelationships > .getDataDomain() > .getEntityResolver() > .getObjEntities() > .forEach( objEntity -> { > new ArrayList<>( > objEntity.getRelationships() ).forEach( relationship -> { > objEntity.removeRelationship( > relationship.getName() ); > } ); > } ); > > final ObjectContext localOC = > horribleMutantRuntimeWithoutRelationships.newContext(); > final List<DataObject> localObjects = new ArrayList<>(); > > for( final DataObject objectFromAnotherRuntime : objectsToDelete ) > { > localObjects.add( localOC.localObject( > objectFromAnotherRuntime ) ); > } > > localOC.deleteObjects( localObjects ); > localOC.commitChanges(); > } > > > *shudder* > > - hugi > > > > On 30 May 2019, at 07:13, Jurgen <do...@xsinet.co.za> wrote: > > > > Hi Hugi > > > > So crazy idea number one is to maybe duplicate your model and revise the > delete rules, then use this DeleteModel to nuke the customer. The downside > of this is having to maintain two models, maybe not such a good idea ? > > > > Idea number two is to add a delete method to each of the classes that > first deletes the children. So you have: > > > > Customer ->> Invoice ->> InvoiceLine ->> InvoiceLineSums > > > > Then add deleteLineSums() to InvoiceLine that deletes its > InvoiceLineSums with something like: getObjectContext().deleteObjects( > getLineSums() ); > > > > Do the same in Invoice where deleteLines() is something like: > > > > for ( InvoiceLine line : getLines() ) line.deleteLineSums(); > > getObjectContext().commitChanges(); > > getObjectContext().invalidateObjects( this ); > > getObjectContext().deleteObjects( getLines() ); > > > > Then the same for Customer .... The downside of all this is that it's > not very efficient in terms of DB calls, but then you won't have to go all > caveman like and "write out damn joins like our ancestors did" :-) > > > > Cheers > > Jurgen > > > >