我有两个实体,其中一个(任务)拥有两个引用另一个实体(用户)。
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;
}
在任务方面,我可以将“一对一”设置为“发布者”,将“一对多”设置为“管理员”,但如何设置用户端的映射?
答案 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
方面的这种关系,而是可以使用查询。