2

it is driving me crazy! I know what this error message means but it does not work!

I need to delete a Hibernate Entity which has some associations.

If I close my Application and reopen it the deletion goes fine. But every time I create that object and delete is afterwards I get this error.

It seems that my session holds that object somewhere I have not in scope.

Heres my deletion snippet

                initialGroups.removeAll(masterGroups);
                for (InterfaceMasterSignalGroup group : initialGroups) {

                    group.getMasterSignals().forEach(s -> s.setMaster(null));
                    group.setMasterSignals(null);

                    group.getConfig().getMasterSignals().remove(group);
                    group.setConfig(null);

                    session.delete(group);

                }

First I delete the 2 referencing parts and delete the object itself. Calling the commit throws "Object whould be resaved by cascade"

Here are the mappings, all other fields aren't associations

@OneToMany(fetch = FetchType.LAZY, mappedBy = InterfaceDestinationSignal.MASTER)
@Cascade({ CascadeType.SAVE_UPDATE, CascadeType.DETACH })
@XmlTransient
public List<InterfaceDestinationSignal> getMasterSignals() {
    return masterSignals;
}

public void setMasterSignals(List<InterfaceDestinationSignal> masterSignals) {
    firePropertyChange(InterfaceMasterSignalGroup.MASTER_SIGNALS, this.masterSignals, this.masterSignals = masterSignals);
}

@ManyToOne
@JoinColumn(name = InterfaceMasterSignalGroup.CONFIG_ID)
@Cascade({ CascadeType.DETACH })
@XmlTransient
public GenericConfigInterfaceEntity getConfig() {
    return config;
}

public void setConfig(GenericConfigInterfaceEntity config) {
    firePropertyChange(InterfaceMasterSignalGroup.CONFIG, this.config, this.config = config);
}

Is there anything I am doing wrong?

Best regards, Pascal


Here's the stacktrace

But it does not help. It says that I should remove the target object from SOME (not which) referencing objects :(

org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [x.y.z.interfaceentity.InterfaceMasterSignalGroup#1]
    at org.hibernate.internal.SessionImpl.forceFlush(SessionImpl.java:1236)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:187)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:114)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:684)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:676)
    at org.hibernate.engine.spi.CascadingActions$5.cascade(CascadingActions.java:235)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:350)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:293)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:118)
    at org.hibernate.event.internal.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:167)
    at org.hibernate.event.internal.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:158)
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:91)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:55)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177)
    at x.y.z.database.DatabaseManager.commit(DatabaseManager.java:187)
    at x.y.z.interfacedatabase.InterfaceDatabaseManager.commit(InterfaceDatabaseManager.java:164)
    at x.y.z.view.dialog.InterfaceMasterDialog$1.widgetSelected(InterfaceMasterDialog.java:163)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4172)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761)
    at org.eclipse.jface.window.Window.runEventLoop(Window.java:832)
    at org.eclipse.jface.window.Window.open(Window.java:808)
    at x.y.z.view.dialog.InterfaceMasterDialog.initAndOpen(InterfaceMasterDialog.java:101)
    at x.y.z.view.dialog.InterfaceEditDialog$2.widgetSelected(InterfaceEditDialog.java:214)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4172)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761)
    at org.eclipse.jface.window.Window.runEventLoop(Window.java:832)
    at org.eclipse.jface.window.Window.open(Window.java:808)
    at x.y.z.view.dialog.InterfaceEditDialog.initAndOpen(InterfaceEditDialog.java:122)
    at x.y.z.view.dialog.InterfaceDialog$2.mouseDoubleClick(InterfaceDialog.java:263)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:196)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4172)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761)
    at org.eclipse.jface.window.Window.runEventLoop(Window.java:832)
    at org.eclipse.jface.window.Window.open(Window.java:808)
    at x.y.z.view.dialog.InterfaceDialog.open(InterfaceDialog.java:134)
    at x.y.z.view.dialog.InterfaceDialog.initAndOpen(InterfaceDialog.java:127)
    at x.y.z.handler.ManageInterfaceHandler.execute(ManageInterfaceHandler.java:46)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
    at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:247)
    at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:229)
    at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132)
    at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:149)
    at org.eclipse.core.commands.Command.executeWithChecks(Command.java:499)
    at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:508)
    at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210)
    at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.executeItem(HandledContributionItem.java:825)
    at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.handleWidgetSelection(HandledContributionItem.java:701)
    at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.access$6(HandledContributionItem.java:685)
    at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem$4.handleEvent(HandledContributionItem.java:613)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4172)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032)
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148)
    at org.eclipse.e4.ui.internal.workbench.swt.E4Application.start(E4Application.java:164)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1465)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1438)
Pascal
  • 2,059
  • 3
  • 31
  • 52
  • If your mappings are correct, you can simple use CascadeType.REMOVE. – We are Borg Sep 04 '15 at 07:18
  • No if I use REMOVE my config and all destinationSignals will be removed. What I want is to detach my masterGroup and delete it. – Pascal Sep 04 '15 at 08:47
  • Then you have to remove associations manually, like objectName.setMappedClass(null) for all of its dependencies, that's the only option I see. # – We are Borg Sep 04 '15 at 08:54
  • can you please add the stacktrace ? what object would be resaved by cascade ? – Pras Sep 04 '15 at 08:55

2 Answers2

1

It seems, your object group is still referring somewhere else. In order to delete it properly first you have to remove from other places where it is referring.

For ex : Lists, Map's or any other collections etc.

Check it is still refereeing any other place.

Suresh Atta
  • 120,458
  • 37
  • 198
  • 307
  • The problem is I do not know where. The underlaying database is sqlite so I have the restriction to have one session only. I have to maintain this session carefully. – Pascal Sep 04 '15 at 07:11
  • @Pascal This might help you out to find the relations : http://stackoverflow.com/questions/806989/mysql-how-to-i-find-all-tables-that-have-foreign-keys-that-reference-particular – Suresh Atta Sep 04 '15 at 07:13
  • I have 2 different dialogs. One for the creation of an group and another for mapping the group. If I create the group -> close that dialog -> reopen that dialog -> deletion works. BUT create the group -> close dialog -> open mapping dialog -> map the group -> CLOSE mapping dialog -> open creation dialog -> deletion fails. I thought closing a dialog destroys all its lists and referencing objects !?! – Pascal Sep 04 '15 at 07:53
0

Ok I have solved the problem. Layer 8 problem sitting infront!

During the assignment I have assigned the group to the destinationSignal but not vice versa. Missing that lead to an empty collection in the group (and therefore nothing was removed) and the exception occours.

Reopening the Application pulled the correct model from the database and the deletion was ok.

Pascal
  • 2,059
  • 3
  • 31
  • 52