使用hibernate删除多对一

使用hibernate删除多对一,hibernate,Hibernate,以下面列出的具有单个地址的人员单向1-1映射为例,从人员中删除地址并删除数据库记录的正确方法是什么?将shipAddr字段设置为null将导致NPE // pseudo code that results in NPE ses.beginTransaction(); person.setShipAddr(null); dao.makePersistent(person); ses.getTransaction().commit(); 解决方案:修改了基于Hibernate文档的伪代码,

以下面列出的具有单个地址的人员单向1-1映射为例,从人员中删除地址并删除数据库记录的正确方法是什么?将shipAddr字段设置为null将导致NPE

// pseudo code that results in NPE
ses.beginTransaction();
person.setShipAddr(null);
dao.makePersistent(person);    
ses.getTransaction().commit();
解决方案:修改了基于Hibernate文档的伪代码,单值一对一或多对一关联不支持孤立删除

 // correct pseudo code 
ses.beginTransaction();
addressDao.makeTransient(person.getShipAddr());    // explicitly delete address
person.setShipAddr(null);
dao.makePersistent(person);    
ses.getTransaction().commit();
类别定义:

class Person {
  private Long id;
  private Integer version;
  private Address shipAddr;
  // other fields
}

class Address {
  private Long id;
  private Integer version;
  // other fields
}
映射文件:

<class name="Person" >
    <id name="id" type="java.lang.Long">
        <column name="ID" />
        <generator class="native" />
    </id>
<version generated="never" name="version" type="java.lang.Integer" />
    <many-to-one name="shipAddr" class="Address" cascade="all-delete-orphan" unique="true" not-null="true" >
        <column name="SHIP_ADDRESS_ID" />
    </many-to-one>
</class>

<Class name="Address" >
    <id name="id" type="java.lang.Long">
        <column name="ID" />
        <generator class="native" />
    </id>
    <version generated="never" name="version" type="java.lang.Integer" />
</class>
删除
cascade=“全部删除孤立项”
。当您有一个子实体集合时,应该使用它,当父实体被删除时,您希望将其删除,因此成为孤立实体,因此我认为
多对一关联不支持它。我建议您手动删除该地址


编辑:官方文档说:请注意,单值多对一关联不支持孤立删除。低于5.1.7。映射一对一和一对多关联

发布异常的堆栈跟踪。尝试删除多对一标记中的“not null=“true”也发布完整堆栈跟踪和版本感谢您花时间阅读和思考我的问题。将cascade更改为“all”会阻止NPE,但原始问题仍然存在,因为该地址未从数据库中删除。感谢您提供指向该文档部分的指针。我关注的是第8.2.2节。一对一关联映射来查找我做错了什么。所以你必须自己删除地址?在删除或更新某人时无法直接执行此操作?
java.lang.NullPointerException
at org.hibernate.engine.EntityEntry.getLoadedValue(EntityEntry.java:255)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:232)
at org.hibernate.engine.Cascade.cascade(Cascade.java:161)
at org.hibernate.engine.Cascade.cascade(Cascade.java:127)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:376)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:350)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:246)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:112)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:673)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:345)
at com.sun.proxy.$Proxy7.saveOrUpdate(Unknown Source)
at com.easa.motordb.dao.internal.GenericHibernateDAO.makePersistent(GenericHibernateDAO.java:93)
at com.easa.motordb.services.internal.AbstractEntity.save(AbstractEntity.java:103)
at com.easa.motordb.services.test.IPersonEntityTest.removeAddress(IPersonEntityTest.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.pde.internal.junit.runtime.RemotePluginTestRunner.main(RemotePluginTestRunner.java:62)
at org.eclipse.pde.internal.junit.runtime.CoreTestApplication.run(CoreTestApplication.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.equinox.internal.app.EclipseAppContainer.callMethodWithException(EclipseAppContainer.java:587)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:198)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
at org.eclipse.equinox.launcher.Main.main(Main.java:1386)