Отношения OneToMany в JPA 2

Я изучал JPA 2 и узнал об отношениях OneToMany и ManyToOne. Вот мои критерии.

  1. Есть две сущности, Сотрудник и Обратная связь.
  2. Сотрудник может получить несколько отзывов. то есть существует связь ManyToOne между обратной связью и Сотрудником. Этого я добился.
  3. Но Сотрудник также может написать несколько отзывов для нескольких сотрудников. Вот где я застреваю.

Я построил отношение Сотрудника к обратной связи следующим образом.

В классе обратной связи

    @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 дизайна базы данных.

http://en.wikibooks.org/wiki/Java_Persistence/ManyToMany

http://en.wikipedia.org/wiki/Third_normal_form

Начните анализировать с того факта, что Обратная связь связана с двумя типами сотрудников: один является автором обратной связи, а второй получает обратную связь. После этого все накапливаются так.

@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; 
}
Другие вопросы по тегам