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

Java Hibernate和级联操作中的1:M关系,java,hibernate,orm,cascade,Java,Hibernate,Orm,Cascade,表2分课程参考资料课程 课程(id、姓名) 次级课程(id、课程号、名称) 所以,1:M Hibernate为课程生成: @OneToMany(fetch = FetchType.LAZY, mappedBy = "course", cascade = CascadeType.ALL) public Set getSubCourses() { return this.subCourses; } @OneToMany(fetch=FetchType.LAZY,map

表2分课程参考资料课程 课程(id、姓名) 次级课程(id、课程号、名称)

所以,1:M

Hibernate为课程生成:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "course", cascade = CascadeType.ALL) public Set getSubCourses() { return this.subCourses; } @OneToMany(fetch=FetchType.LAZY,mappedBy=“course”,cascade=CascadeType.ALL) 公共集getSubCourses(){ 返回此文件。分课程; } 对于它生成的子课程

@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "course_id", nullable = false) public Course getCourse() { return this.course; } @manytone(fetch=FetchType.LAZY) @JoinColumn(name=“course\u id”,nullable=false) 公共课程{ 返回本课程; } 现在的问题是级联并没有像预期的那样工作。 我想创建一个子课程对象集合(集合),填充它,然后 将其绑定到setSubCourses()当然是对象。然后简单地保存课程对象

但是,由于Subcourses表中有许多内容,我需要手动执行 在添加到每个对象上的集合之前,设置课程()。如果我不这样做, 将课程对象与其集合持久化时引发异常

你能给我推荐什么


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

这似乎是游戏的一部分。引自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);
  }
  ...
}

使用双向关联时,必须正确设置链接的两侧(如中所述)。我经常使用文档中建议的防御方法:

许多开发人员都在防御性地编程 并创建链接管理方法来 正确设置两侧(例如, 在
个人中
):

的get和set方法 收藏现在受到保护。这 允许同一包中的类和 子类仍然可以访问 方法,但阻止其他人 从改变收藏 直接的。重复以下步骤,以完成以下操作: 收集在另一边

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);
}