Повторяющиеся записи с использованием двунаправленного отображения в Hibernate - PullRequest
0 голосов
/ 30 мая 2018

Я хочу хранить работников в объекте Organization. Для этого у меня есть класс Organization, имеющий сопоставление «один ко многим» для работников.

@OneToMany(cascade=CascadeType.ALL,fetch = FetchType.EAGER)
@JoinTable(name = "ORGANIZATION_WORKER", joinColumns = { @JoinColumn(name = "orgIdPK") }, inverseJoinColumns = { @JoinColumn(name = "id") })
public Set<Worker> workerList;

«ORGANIZATION_WORKER - это временная таблица, которая содержит сопоставление»

Затем у меня есть класс Worker, в котором я сопоставляю «многие к одному» следующим образом.

@ManyToOne(cascade=CascadeType.ALL,fetch = FetchType.LAZY)
@JoinColumn(name = "orgIdPK")
public Organization organization;

Теперь, когда я сохраняю организацию после вставки в нее работников, используя сеанс гибернации, то есть

session.saveOrUpdate(org);

запрос вставки выполняется дважды (проблема N + 1).`

Hibernate: insert into ORGANIZATION_WORKER (orgIdPK, id) values (?, ?)
Hibernate: insert into ORGANIZATION_WORKER (orgIdPK, id) values (?, ?)

Поэтому, когда я раскрываю данные организации в API отдыха, все записи показываются дважды, из-за чего разбивка на страницы происходит неправильно в API остальных.Кто-нибудь знает, как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Проблема в том, что вы создаете циклическую ссылку.Вы вставляете организацию, в которой есть работники, а эти работники имеют ту же организацию в качестве параметра, поэтому она вставляется дважды.

Чтобы решить эту проблему, Hibernate имеет несколько ключевых слов, применимых к столбцам: «вставляемый»и «обновляемый», который указывает, будет ли значение этого столбца вставляться или обновляться в БД.

В общем, правильная вещь - сделать связь OneToMany не вставляемой и не обновляемой;если вы хотите изменить Организацию работника, вы, вероятно, сделаете это от этого работника;класс, ответственный за обновление этого значения, - это сам Worker, то есть класс с ассоциацией ManyToOne.

Так что вам нужно сделать это:

@ OneToMany (cascade = CascadeType.ALL,fetch = FetchType.EAGER, inserttable = false, Updatable = false)

Таким образом, все изменения в этом столбце будут игнорироваться при вставке или обновлении объекта в БД.

0 голосов
/ 30 мая 2018

Удалить аннотации из Worker.

@ ManyToOne (cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn (name = "orgIdPK")

http://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/Hibernate_User_Guide.html#collections-map-unidirectional

...