OneToMany& ManyToOne在Hibernate Mapping中

时间:2014-12-15 14:28:19

标签: mysql hibernate spring-mvc model annotations

public class ClassYear {
    private Set<Examination> examination = new HashSet<Examination>();

    @Id
    @Column(name = "class_id")
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    @DocumentId
    public String getId() {
        return id;
    }

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

    @OneToMany(cascade={CascadeType.ALL},fetch=FetchType.EAGER)
    @JoinColumn(name="class_id")
    public Set<Examination> getExamination() {
        return examination;
    }

    public void setExamination(Set<Examination> examination) {
        this.examination = examination;
    }
}

public class Examination {
    private ClassYear classYear;

    @ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER)
    @JoinColumn(name="class_id")
    public ClassYear getClassYear() {
        return classYear;
    }

    public void setClassYear(ClassYear classYear) {
        this.classYear = classYear;
    }
}

所以这里,Examination表引用了ClassYear表的class_id列。现在我需要在其他几个表上使用class_id列。我应该怎么做..?这是一对多的关系概念,但我需要在许多表上使用class_id(比如HomeWork表)。我搜索了互联网,找到了一对多的解释。多对一的概念,但我无法确切地找到如何为表中的特定列作为一对多关系的多个表执行此操作。

1 个答案:

答案 0 :(得分:2)

Examination实体拥有该关系,因此您应该使用ClassYear这样的mappedBy实体(这是关系的非拥有方)中的考试(不加入)列):

@OneToMany(mappedBy="classYear", cascade={CascadeType.ALL})
public Set<Examination> getExamination() {
    return examination;
}

我在此示例中删除了EAGER获取类型(@OneToMany的默认值为LAZY)。我不知道你的用例,但是总是热切地提取这样的映射集合并不是最好的主意。

如果您需要在ClassYear等其他实体中引用HomeWork,请执行相同的操作。 HomeWork实体将@ManyToOne映射到ClassYear,并且将成为关系的拥有方(就像在Examination中一样)和ClassYear的所有主页}可以使用mappedBy实体中的ClassYear进行映射。

还有一个小细节:

@ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER)

@ManyToOne默认使用EAGER抓取类型,因此您无需手动指定。