Java 休眠已删除的对象,然后重新保存
它快把我逼疯了! 我知道此错误消息的含义,但它不起作用 我需要删除一个Hibernate实体,它有一些关联 如果我关闭我的应用程序并重新打开它,删除就可以了。但每次我创建那个对象并删除之后,我都会得到这个错误 我的会话似乎将该对象保存在范围之外的某个地方 这是我的删除片段Java 休眠已删除的对象,然后重新保存,java,hibernate,exception,Java,Hibernate,Exception,它快把我逼疯了! 我知道此错误消息的含义,但它不起作用 我需要删除一个Hibernate实体,它有一些关联 如果我关闭我的应用程序并重新打开它,删除就可以了。但每次我创建那个对象并删除之后,我都会得到这个错误 我的会话似乎将该对象保存在范围之外的某个地方 这是我的删除片段 initialGroups.removeAll(masterGroups); for (InterfaceMasterSignalGroup group : in
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);
}
首先,我删除了2个引用部分,并删除了对象本身。
调用提交抛出“将通过级联重新保存的对象”
这里是映射,所有其他字段都不是关联
@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);
}
看起来,您的对象
组仍在引用其他地方。为了正确地删除它,首先你必须从它引用的其他地方删除它
例如:列表、地图或任何其他集合等
检查它是否仍在其他地方裁判。好的,我已经解决了问题。第八层问题就在前面
在分配期间,我已将组分配给目标信号,但反之亦然。缺少该选项将导致组中出现空集合(因此未删除任何内容)和异常occours
重新打开应用程序从数据库中提取了正确的模型,删除操作正常。问题是我不知道在哪里。参考底图数据库是sqlite,所以我有限制,只能有一个会话。我必须小心地维护这个会话。@Pascal这可能会帮助您找到关系:我有两个不同的对话框。一个用于创建组,另一个用于映射组。如果我创建组->关闭该对话框->重新打开该对话框->删除有效。但是创建组->关闭对话框->打开映射对话框->映射组->关闭映射对话框->打开创建对话框->删除失败。我以为关闭对话框会破坏它的所有列表和引用对象!?!如果映射正确,您可以简单地使用CascadeType.REMOVE.No,如果我使用REMOVE my config,所有目标信号都将被删除。我想要的是分离我的主组并将其删除。然后您必须手动删除关联,如objectName.setMappedClass(null)对其所有依赖项,这是我看到的唯一选项#你能添加stacktrace吗?cascade将重新保存哪个对象?
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)