отображение объекта, у которого два ссылаются на другой же объект - PullRequest
0 голосов
/ 18 марта 2011

У меня есть две сущности, одна из которых (Задача) владеет двумя ссылками на другую сущность (Пользователь).

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 Ответ

3 голосов
/ 18 марта 2011

Это зависит от того, что вы хотите иметь в базе данных.

Если вы хотите иметь отдельный внешний ключ для 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, и вы можете вместо этого использовать запросы.

...