Hibernate - 一对多关系和孤儿删除级联

2024-04-27

我有一个基本的一对多关系父/子关系,就像 Hibernate 参考书第 21 章中一样。
级联仅从子级到父级(保留级联只是因为我不想在删除子级时删除父级)。
当我向父级添加一个子级并保存该子级时,出现 TransientObjectException...

@Entity
public class Parent implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @OneToMany(mappedBy = "parent", orphanRemoval = true)
  private List<Child> childs;

  public List<Child> getChilds() {
    return childs;
  }

  public void setChilds(List<Child> childs) {
    this.childs = childs;
  }

  public void addChild(Child child) {
    if (childs == null) childs = new ArrayList<Child>();
    if (childs.add(child)) child.setParent(this);
  }

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }
}

@Entity
public class Child implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @ManyToOne(optional = false)
  @Cascade( { PERSIST, MERGE, REFRESH, SAVE_UPDATE, REPLICATE, LOCK, DETACH })
  private Parent parent;

  public Parent getParent() {
    return parent;
  }

  public void setParent(Parent parent) {
    this.parent = parent;
  }

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }
}


@Test
public void test() {
  Parent parent = new Parent();
  Child child = new Child();
  parent.addChild(child);
  genericDao.saveOrUpdate(child);
}

但在 saveOrUpdate 上,我有这个例外:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: Child
  at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:244)
  at org.hibernate.collection.AbstractPersistentCollection.getOrphans(AbstractPersistentCollection.java:911)
  at org.hibernate.collection.PersistentBag.getOrphans(PersistentBag.java:143)
  at org.hibernate.engine.CollectionEntry.getOrphans(CollectionEntry.java:373)
  at org.hibernate.engine.Cascade.deleteOrphans(Cascade.java:471)
  at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:455)
  at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:362)
  at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:338)
  at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
  at org.hibernate.engine.Cascade.cascade(Cascade.java:161)
  at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:476)
  at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:354)
  at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
  at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
  at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
  at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
  at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
  at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
  at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:677)
  at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:669)
  at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:252)
  at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392)
  at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335)
  at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
  at org.hibernate.engine.Cascade.cascade(Cascade.java:161)
  at org.hibernate.event.def.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:451)
  at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:288)
  at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
  at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
  at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
  at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
  at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
  at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
  at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:677)
  at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:669)
  at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:665)

我真的不明白,因为拯救孩子应该通过级联拯救父母...... 有任何想法吗 ?

UPDATE 1
该问题似乎与“orphanRemoval”有关,因为如果我对父级进行评论:

@OneToMany(mappedBy = "parent" /*, orphanRemoval = true */)
private List<Child> childs;

有用!
它拯救了孩子,然后是父母。
但当我从父级中删除子级时,我确实需要通过级联删除孤儿。

UPDATE 2
我创建了一个 JIRA 问题:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-5364 http://opensource.atlassian.com/projects/hibernate/browse/HHH-5364

UPDATE 3
看来已经修复了:-)
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2269 http://opensource.atlassian.com/projects/hibernate/browse/HHH-2269


这是 Hibernate 中的一个问题,现已修复:

http://opensource.atlassian.com/projects/hibernate/browse/HHH-2269 http://opensource.atlassian.com/projects/hibernate/browse/HHH-2269

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate - 一对多关系和孤儿删除级联 的相关文章

随机推荐

  • input[type=hidden] 和visibility="hidden" 之间的区别

    有什么区别input type hidden and visibility hidden 第一个是输入元素 第二个用于 CSS2 中的样式 visibility hidden 可见性属性指定元素是否可见 输入 类型 隐藏 http www
  • R:如何获取时间序列数据中日期时间列的最大值

    我正在研究时间序列数据 我有 2 个日期时间列和 1 个会计周列 我给出了一个例子 我遇到如下情况 我需要获取 EditDate 的最大值 EditDate lt c 2015 04 01 11 40 13 2015 04 03 02 54
  • mat Snackbar 单元测试消息为空

    我有一个使用的定制服务matSnackbar显示警报和自定义matSnackbar用作 SnackBar 模板的组件 我为它编写了一个单元测试 并想测试在其中显示我的消息 fit should show my alert message g
  • 2.0版本的System.Management.Automation?

    是否有 2 0 或更高 版本System Management Automation集会 我正在看PowerShell http technet microsoft com en us library system management a
  • Cython:如何使用 C++ 类的用户定义转换?

    赛通的文档 https cython readthedocs io en latest src userguide wrapping CPlusPlus html overloading operators似乎对如何用户定义的转换 http
  • 在 bash 脚本中获取星期几

    我想在变量中包含星期几DOW 所以我使用以下 bash 脚本 DOM date d DOW DOM 7 sed s 0 不幸的是我收到这个错误 bash 09 command not found 变量中的预期结果为 2 9 7 2 DOW
  • 在 Ubuntu 12.04 中打开 eclipse juno 并出现错误“No more handles ...”

    从今天开始 每次我打开 Eclipse 时 都会弹出一个标题为 出现问题 的消息框 内容如下 不再处理 未知的 Mozilla 路径 未设置 MOZILLA FIVE HOME 可能的参数 0 1 2 3 不再有句柄 未知的 Mozilla
  • Wicket setResponsePage() 方法如何工作?

    在学习 JSP 和 servlet 时 我听说了重定向和调度 他们中的哪一个做 Wicket 的setResponsePage 履行 What setResponsePage确实取决于几个因素 您调用 setResponsePage 的次数
  • 仅使用视频标签实时流式传输到 HTML5(不带 webrtc)

    我想将实时编码数据包装到 webm 或 ogv 并将其发送到 html5 浏览器 webm 或 ogv 可以做到这一点吗 Mp4 由于其 MDAT 原子而无法做到这一点 无法实时将h264和mp3打包并发送给客户端 假设我正在从网络摄像头输
  • 为什么 Swift 中委托方法需要公开?

    我正在快速开发一个框架 我正在创建一个处理框架中 BLE 内容的类 这个类应该是公共的 因为我需要从使用我的框架的外部应用程序访问这个类 我的班级结构如下 public class MyClass NSObject CBCentralMan
  • Typescript 2 中分号是必需的吗?

    我一直在寻找这个问题的答案 但收到的信息很复杂 我知道分号在 JavaScript 中是必需的 因为自动分号插入 ASI 但是 TypeScript 是否有相同的限制 我认为它不会 因为它会转换为 JavaScript 并且很可能会在 AS
  • 谷歌折线图:如何添加单位?

    https google developers appspot com chart interactive docs gallery linechart Example https google developers appspot com
  • React 项目中的 Typescript 不再识别“as”关键字

    我将 react scripts 升级到最新版本 以消除 在定义之前使用 React 错误 我还升级到了最新版本的打字稿 现在我收到以下信息 Failed to compile src components NearBy tsx Line
  • ActionBar 上的自定义主页按钮

    我正在使用 ActionBar Sherlock 库 所以 要更改默认的主页按钮 我这样做了 这不起作用 所以 我也添加了这个
  • HTML5 下载属性不适用于 Mozilla [重复]

    这个问题在这里已经有答案了 a class download btn href https example com test pdf target blank Download a 我上面有简单的下载链接html5代码 它在 mozilla
  • 导入数千条记录后无法推送到 Heroku

    我有一个问题 我认为我的 sqlite3 数据库太大 我将大约 100 000 条记录导入到数据库中 并且能够 git Push 和 git Push heroku 现在我可能犯了一个错误 导入了太多记录 500 000 我能够推送到 gi
  • Django - 在设置中使用反向 url 映射

    例如 django 设置文件中的一些选项是 urlLOGIN URL and LOGIN REDIRECT URL 是否可以避免对这些 url 进行硬编码 而使用反向 url 映射 目前 这确实是我发现自己在多个地方编写相同网址的唯一地方
  • 是否可以阻止对象的堆栈分配并只允许使用“new”实例化它?

    是否可以阻止对象的堆栈分配并只允许在堆上使用 new 来启动它 实现此目的的一种方法是将构造函数设为私有 并且只允许通过返回指针的静态方法进行构造 例如 class Foo public Foo static Foo createFoo r
  • 使用vba分割和重命名pdf文件

    我收到了一份包含多张工资单的合并文件 每张工资单上的特定位置都有一个特定的数字 我希望使用这个确切的数字作为每个文件名 例如37224 pdf 我尝试使用下面的 VBA 代码将工资单拆分并命名为单独的工资单 Option Explicit
  • Hibernate - 一对多关系和孤儿删除级联

    我有一个基本的一对多关系父 子关系 就像 Hibernate 参考书第 21 章中一样 级联仅从子级到父级 保留级联只是因为我不想在删除子级时删除父级 当我向父级添加一个子级并保存该子级时 出现 TransientObjectExcepti