2011-03-18 225 views
0

我有两个实体,其中一个(Task)自己两个引用另一个实体(用户)。映射一个实体有两个引用另一个实体

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; 
} 

在任务方面,我可以设置“一比一”到“发行人”,和“一到多”到“经理”,但是如何设置映射在用户侧?

回答

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; 

    ... 
} 

如果actaully需要的任务在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方面的这种关系,而是可以使用查询。

+0

非常感谢!我从来没有想过在用户中可以有两个List ,谢谢。:)我会试一试! :) – hguser 2011-03-18 11:39:51