2

表 SUBCOURSE 参考 COURSE COURSE(id, name) SUBCOURSE(id, course_id, name)

所以,1:M。

Hibernate 为 Course 生成:

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "course", cascade = CascadeType.ALL)
    公共设置 getSubCourses() {
        返回 this.subCourses;
    }

对于它生成的 Subcourse

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "course_id", nullable = false)
    公共课程 getCourse() {
        返回此课程;
    }

现在的问题是级联没有按预期工作。我想创建一个 SubCourse 对象(Set)的集合,填充它然后将其绑定到 Course 对象的 setSubCourse()。然后简单地持久化 Course 对象。

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

你能给我推荐什么?

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

4

2 回答 2

6

这似乎是游戏的一部分。引用 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);
  }
  ...
}
于 2010-04-08T20:46:17.790 回答
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);
}

集合的 get 和 set 方法现在受到保护。这允许同一包和子类中的类仍然访问方法,但防止其他人直接更改集合。对另一侧的集合重复上述步骤。

于 2010-04-08T21:54:13.063 回答