表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。或者这可能是游戏的一部分?手动设置每个孩子的父对象?
答案 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); }
获取和设置方法 收藏现在受到保护。这个 允许同一个包中的类和 子类仍然访问 方法,但防止其他人 从改变收藏品 直。重复上述步骤 收集在另一边。