Hibernate:A类可以有多个B类对象集合吗?

时间:2014-04-17 09:49:52

标签: java hibernate many-to-many

我正在尝试用Hibernate(3.6)实现一个特定的行为,因为我无法找到任何信息。

基本上,我想在两个表之间建立多对多的关系,如下所示:

class Task {
    private Long id;
    private Set<Person> personsInCharge;
    private Set<Person> contributors;
    private Set<Person> validators;
}

class Person {
    private Long id;
    private Set<Task> tasks;
}

我的问题是,同一个人可以根据任务或同一任务的不同角色拥有不同的角色,因此无法为此人定义“固定”角色。 所以,如果我可以有一个连接表,我可以添加一个特定的“角色”作为第三个主键,然后在我的映射文件中使用自定义加载器,这将是方便的。 有没有办法使用Hibernate定义它,或者我应该创建一个特定的过渡POJO(或“手工”表)?

提前感谢您的任何反馈。

1 个答案:

答案 0 :(得分:1)

这听起来更像是一个标准的“多对多”&#39;映射到我,我认为它可以实现如下..

    class Task {

    private Long id;


    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "task_incharge", joinColumns = { @JoinColumn(name = "task_id",  referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "person_id", referencedColumnName = "id") })    
    private Set<Person> personsInCharge;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "task_contributors", joinColumns = { @JoinColumn(name = "task_id",  referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "person_id", referencedColumnName = "id") })    
    private Set<Person> contributors;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "task_validators", joinColumns = { @JoinColumn(name = "task_id",  referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "person_id", referencedColumnName = "id") })  
    private Set<Person> validators;

}

这里我们有三个额外的中间表,即task_incharge,task_contributors和task_validators。

同样,你需要Person类中的多对多集合,即

private Set<Task> contributedTasks;
private Set<Task> validatedTasks;
private Set<Task> inchargeOf;

为这些使用相同的映射表,只需将@JoinTable内的@JoinColumn顺序颠倒到内部订购