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