hibernate注释双向映射

时间:2010-01-12 22:44:28

标签: java hibernate

我正在使用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;
    }

}

问题是这个实现只允许我走一条路

user.getCourses()

我需要改变什么,所以我可以双向前进?

user.getCourses()
course.getUsers()

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:0)

Hibernate不会在您的getUsers()课程中神奇地添加Course方法,您需要自己执行此操作以及Set<User>字段。

我不知道您阅读了哪个教程,但是您应该阅读适当的文档(请参阅bidirectional associations上的手册部分),特别是在谈到多对多关系时。

答案 1 :(得分:0)

我猜你需要的是双向很多关系。在这种情况下,一方必须是所有者。此示例可能有所帮助:http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/ (2.2.5.3.3。多对多)

答案 2 :(得分:0)

要尝试的一件事是将@MappedBy注释用于不拥有关系的关系一侧。

另外一点,如果没有理由你明确需要添加所有其他注释(比如@Table,@ Column),你可以将它们排除在外,让Hibernate在幕后为你工作。除非你需要,否则hibernate团队建议使用默认值(不要添加注释)。