2010-04-08 37 views
0

表SUBCOURSE引用课程 课程(ID,姓名) SUBCOURSE(ID,COURSE_ID,名)1:休眠和级联操作中号的关系

因此,1:M。

Hibernate自动生成的课程:

 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "course", cascade = CascadeType.ALL) 
    public Set getSubCourses() { 
     return this.subCourses; 
    } 

为Subcourse它产生

 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "course_id", nullable = false) 
    public Course getCourse() { 
     return this.course; 
    } 

现在的问题是,随着预期的级联不起作用。 我想创建SubCourse对象(Set)的集合,填充它,然后将其绑定到Course对象的setSubCourses()。然后简单地坚持课程对象。

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

你能推荐我什么?

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

回答

4

看来这是游戏的一部分。从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); 
    } 
    ... 
} 
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); 
} 

的获取和设置 集合的方法现在受到保护。此 允许同一包中的类和 子类仍可访问 方法,但会阻止其他人 直接更改集合 。在另一侧重复 集合的步骤。