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

Java Hibernate-一对多关系和删除级联,java,hibernate,one-to-many,cascade,orphan,Java,Hibernate,One To Many,Cascade,Orphan,我有一个基本的一对多关系,如《Hibernate参考书》第21章中的父母/孩子。 级联仅从子级到父级(仅当我删除子级时不想删除父级时才持久级联)。 当我将子对象添加到父对象并保存该子对象时,我有一个TransientObjectException @Entity public class Parent implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long

我有一个基本的一对多关系,如《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);
}
我真的不明白,因为保存孩子应该通过级联保存家长。。。 有什么想法吗

更新1
问题似乎与“孤儿移除”有关,因为如果我在家长身上发表评论:

@OneToMany(mappedBy = "parent" /*, orphanRemoval = true */)
private List<Child> childs;
@OneToMany(mappedBy=“parent”/*,orphanRemoving=true*/)
私人名单儿童;
它起作用了
它先保存孩子,然后保存家长。
但是当我从父对象中删除一个子对象时,我真的需要通过级联删除孤儿对象

更新2
我已经创建了一个JIRA问题:

更新3
它似乎是固定的:-)

基本上,您违反了约束。数据库中与父级对应的行不存在,因此子级不能使用外键关系引用父级。在为子级执行do之前,在父级上添加对saveOrUpdate的调用


(编辑)我错过了你在重新格式化之前对cascade的评论。我记得cascade并不是以这种方式向上游工作的;您仍然需要先保存父级

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


欢迎使用堆栈溢出!使用带有0和1的按钮在将来正确格式化代码(我为您格式化了)。谢谢。。。我们同时做了;-)如果在保存子对象之前先保存父对象,会发生什么情况?它可以工作,但我无法在应用程序中执行此操作。子元素在其他实体中使用,并通过级联保存。。。这就是为什么我希望在保存子项时也保存它们的父项。好的,但是saveOrUpdate in在单个事务中执行,因此它首先保存子项,然后级联应该创建父项(并更新子外键),最后刷新到DB,只有在这一刻才验证约束。。。否?您是否尝试将“inverse=true”添加到父映射中?我认为这不管用,但Hibernate让我感到惊讶。我使用的不是xml配置,而是注释@OneToMany(mappedBy=“parent”)也这么做。看来我的问题来自孤儿院。。。我刚刚更新了我的帖子。@Cedric:看起来像冬眠中的一只虫子。
@OneToMany(mappedBy = "parent" /*, orphanRemoval = true */)
private List<Child> childs;