2010-01-12 141 views
1

我正在构建一个使用Spring框架和Hibernate注释的Web应用程序,并陷入两个实体之间的简单映射。休眠注释双向映射

我正尝试在用户和课程之间创建多对多的关系。我跟着Hibernate的教程之一,我的实现如下:

用户等级:

@Entity 
@Table(name="USER") 
public class User { 

    private Long id; 
    private String email; 
    private String password; 
    private Set<Course> courses = new HashSet<Course>(0); 


    @Id 
    @GeneratedValue 
    @Column(name="USER_ID") 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 


    @Column(name="USER_EMAIL") 
    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    @Column(name="USER_PASSWORD") 
    public String getPassword() { 
     return password; 
    } 
    public void setPassword(String password) { 
     this.password = password; 
    } 

    @ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "USER_COURSE", joinColumns = 
    { @JoinColumn(name = "USER_ID") }, 
    inverseJoinColumns = { @JoinColumn(name = "COURSE_ID") }) 
    public Set<Course> getCourses() { 
     return courses; 
    } 

    public void setCourses(Set<Course> courses) { 
     this.courses = courses; 
    } 
} 

课程类:

@Entity 
@Table(name="COURSE") 
public class Course { 

    private Long id; 
    private String name; 

    @Id 
    @GeneratedValue 
    @Column(name="COURSE_ID") 
    public Long getId() { 
     return id; 
    } 
    public void setId(Long id) { 
     this.id = id; 
    } 

    @Column(name="NAME") 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

} 

的问题是,这个实现只允许我去一个way

user.getCourses() 

我需要改变什么,所以我可以在两个方向?

user.getCourses() 
course.getUsers() 

任何帮助,将不胜感激。

+0

我已经删除了spring标签,因为这个问题与Spring没有任何关系 – skaffman

回答

0

休眠不会奇迹般地为您的Course类添加一个getUsers()方法,您需要自己完成该操作,以及Set<User>字段。

我不知道您阅读了哪个教程,但您应该阅读正确的文档(请参阅bidirectional associations手册的章节),特别是在讨论多对多关系时。

0

一件事是尝试使用@MappedBy标注为不拥有的关系,关系的一面。如果没有理由明确地需要添加所有其他注释(如@Table,@Column),您可以将它们留出,让Hibernate在幕后为您做这项工作。除非需要,否则hibernate团队建议使用默认值(不要添加注释)。