Отношения OneToMany в JPA 2
Я изучал JPA 2 и узнал об отношениях OneToMany и ManyToOne. Вот мои критерии.
- Есть две сущности, Сотрудник и Обратная связь.
- Сотрудник может получить несколько отзывов. то есть существует связь ManyToOne между обратной связью и Сотрудником. Этого я добился.
- Но Сотрудник также может написать несколько отзывов для нескольких сотрудников. Вот где я застреваю.
Я построил отношение Сотрудника к обратной связи следующим образом.
В классе обратной связи
@ManyToOne
@JoinColumn(name="idEmployee")
private Employee employee;
и в классе Сотрудник,
@OneToMany(mappedBy = "employee", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Feedback> feedbacks = new ArrayList<Feedback>();
Теперь я могу получить все отзывы, полученные для сотрудника. Но Сотрудник также может давать отзывы другим сотрудникам. Как я могу достичь этих отношений?
Нужно ли мне использовать карту отношений? Если да, то почему?
3 ответа
Вам нужно еще одно отношение OneToMany: убедитесь, что два столбца в таблице БД представляют Feedback
: author
а также receivee
: они будут указывать на первичный ключ таблицы employee, поэтому они должны иметь тот же тип, что и этот. Добавьте ограничения внешнего ключа: оба они должны указывать на первичный ключ employee
Таблица. Затем сопоставьте отношения в Java, как описано в ответе zbigniew:
Классобратной связи:
@ManyToOne
@JoinColumn(name="author")
private Employee author;
@ManyToOne
@JoinColumn(name="receivee")
private Employee receivee;
Класссотрудника:
@OneToMany(mappedBy = "author", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Feedback> givenFeedbacks;
@OneToMany(mappedBy = "receivee", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Feedback> receivedFeedbacks;
Как я правильно понял, между двумя таблицами существует отношение "многие ко многим". Вы должны либо аннотировать с @ManyToMany
или иметь таблицу мостов, чтобы таблица мостов имела отношение "многие к одному" с FeedBack и отношение "многие к одному" с Employee. Я предпочитаю второй подход, потому что это уважает NF3 дизайна базы данных.
Начните анализировать с того факта, что Обратная связь связана с двумя типами сотрудников: один является автором обратной связи, а второй получает обратную связь. После этого все накапливаются так.
@Entity
class Feedback {
// id etc ...
@ManyToOne
Employee author;
@ManyToOne
Employee receivee;
}
@Entity
class Employee {
// id etc ...
@OneToMany(mappedBy="author")
List<Feedback> feedbackGiven;
@OneToMany(mappedBy="receivee")
List<Feedback> feedbackReceived;
}