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

表SUBCOURSE引用课程课程(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()。 然后简单地坚持课程对象。

尽管在Subcourses表中有ManyToOne事物,但我需要在添加到每个对象上的集合之前手动设置setCourse()。 如果我不这样做,当使用其集合保持Course对象时会引发异常。

你能推荐我什么?

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


看起来这是游戏的一部分。 从Hibernate书中引用(指的是Item为父项且Bid为子Item的示例):

如果您只调用了一个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.2.6。双向链接文档)。 我经常使用文档中建议的防御方法:

许多开发者通过防守编程并创建链接管理方法来正确设置双方(例如, 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方法现在受到保护。 这允许相同包和子类中的类仍然可以访问方法,但是可以防止其他人直接更改集合。 在另一侧重复收集步骤。

链接地址: http://www.djcxy.com/p/37037.html

上一篇: 1:M relationship in Hibernate and cascading operations

下一篇: Create 3D animtation for Android Apps