1:Hibernate和级联操作中的M关系

Eug*_*neP 2 java orm hibernate cascade

表SUBCOURSE引用COURSE COURSE(id,name)SUBCOURSE(id,course_id,name)

所以,1:M.

Hibernate为课程生成:

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "course", cascade = CascadeType.ALL)
    public Set getSubCourses() {
        return this.subCourses;
    }

对于它产生的子课程

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "course_id", nullable = false)
    public Course getCourse() {
        return this.course;
    }

现在问题是级联不能按预期工作.我想创建一个SubCourse对象集合(Set),填充它然后将它绑定到Course对象的setSubCourses().然后只需保留Course对象即可.

虽然,在Subcourses表中有ManyToOne的东西,我需要在添加到每个对象的集合之前手动setCourse().如果我不这样做,则在使用其集合持久化Course对象时会引发异常.

你能推荐我什么?

PS或者这可能是游戏的一部分?手动设置每个孩子的父对象?

Pét*_*rök 5

这似乎是游戏的一部分.来自Hibernate书籍的引用(指的Item是父亲和Bid孩子的例子):

如果你只打电话anItem.getBids().add(bid),没有任何变化是持久的!只有aBid.setItem(anItem)正确设置了另一面,才能得到你想要的东西.这与没有Hibernate的Java中的行为一致:如果关联是双向的,则必须在两侧创建带有指针的链接,而不仅仅是一个.这是我们推荐便利方法的主要原因 addBid()- 它们在没有容器管理关系的情况下处理系统中的双向引用.

上面提到的课程是

public class Item {
  ...
  private Set bids = new HashSet();
  public void setBids(Set bids) {
    this.bids = bids;
  }
  public Set getBids() {
    return bids;
  }
  public void addBid(Bid bid) {
    bid.setItem(this);
    bids.add(bid);
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)