映射具有两个的实体引用另一个相同的实体

时间:2011-03-18 10:37:36

标签: hibernate mapping entity

我有两个实体,其中一个(任务)拥有两个引用另一个实体(用户)。

public class Task{
    private int id;

    private User publisher;

    private List<User> manager;
}

public User{
    private int id;
    private String name;
    private List<Task> tasks;
}

在任务方面,我可以将“一对一”设置为“发布者”,将“一对多”设置为“管理员”,但如何设置用户端的映射?

1 个答案:

答案 0 :(得分:3)

这取决于您希望在数据库中拥有的内容。

如果您想为publisher创建一个单独的外键并为manager加入表格,那么最简单的方法就是将其映射到另一边:

public class Task{
    @ManyToOne 
    private User publisher;

    @ManyToMany
    private List<User> manager;

     ...
}

public User{
     @OneToMany(mappedBy = "publisher")
     private List<Task> publishedTasks;

     @ManyToMany(mappedBy = "manager")
     private List<Task> managedTasks;

     ...
}

如果您在User中需要单个任务列表,则可以通过编程方式创建。

或者,您可以使用一个具有附加Role属性的连接表:

public enum Role { PUBLISHER, MANAGER }

public class Task{
    @ManyToMany
    @MapKeyEnumerated
    private Map<Role, User> participants;
     ...
}

public User{
    @ManyToMany(mappedBy = "participants")
    private List<Task> tasks;
     ...
}

另外想想你是否需要这种关系是双向的。当您需要特定用户参与的所有任务的列表时,看起来没有那么多用例。也许你根本不需要User方面的这种关系,而是可以使用查询。