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

时间:2010-04-08 13:09:29

标签: java hibernate orm cascade

表SUBCOURSE引用COURSE 课程(身份证,姓名) 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对象与其集合持久化时会引发异常。

你能推荐我什么?

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

2 个答案:

答案 0 :(得分: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);
  }
  ...
}

答案 1 :(得分:0)

使用双向关联时,必须正确设置链接的两个方面(如1.2.6. Working bi-directional links中所述)。我经常使用文档中建议的防御方法:

  

许多开发人员都在防守计划   并创建链接管理方法   正确设置两侧(例如,   在Person):

protected Set getEvents() {
    return events;
}

protected void setEvents(Set events) {
    this.events = events;
}

public void addToEvent(Event event) {
    this.getEvents().add(event);
    event.getParticipants().add(this);
}

public void removeFromEvent(Event event) {
    this.getEvents().remove(event);
    event.getParticipants().remove(this);
}
     

获取和设置方法   收藏现在受到保护。这个   允许同一个包中的类和   子类仍然访问   方法,但防止其他人   从改变收藏品   直。重复上述步骤   收集在另一边。