Hibernate переписывает многие во многие энты? - PullRequest
1 голос
/ 01 февраля 2011

У меня есть объект домена, который содержит коллекцию другого объекта через аннотацию @ManyToMany:

@ManyToMany(fetch=FetchType.LAZY,cascade = { CascadeType.MERGE, CascadeType.PERSIST})
    @JoinTable(name = "join_table", joinColumns=@JoinColumn(name="a_id", referencedColumnName = "a_id"), inverseJoinColumns=@JoinColumn(name = "b_id", referencedColumnName = "b_id"))
    private List<B> BsList;

В таблице соединений я держу дополнительные столбцы данных.

Я заметил, что когда я работаю с объектом, который содержит список, и вызываю setBsList(), данные, которые были в дополнительных столбцах, удаляются. Hibernate каждый раз перезаписывает строки в таблице соединений?

Ответы [ 2 ]

1 голос
/ 01 февраля 2011

Вы не должны звонить setBsList(), вам следует напрямую изменить getBsList(), иначе Hibernate не сможет отследить, что изменилось.

При загрузке фактический List, который вы получаете, является Hibernate-конкретная реализация, которая имеет дело с отложенной загрузкой и отслеживает то, что добавлено и удалено, так что оно может быть корректно обновлено.Если вы замените его другой реализацией списка, он удалит старый и только добавит, а затем только добавит новые записи.При использовании Hibernate с коллекциями рекомендуется защищать сеттер, чтобы случайно не сделать это.

1 голос
/ 01 февраля 2011

В таблице соединений я храню дополнительные столбцы данных.

Если у вас есть дополнительные столбцы данных, это не таблица объединения.Это таблица с двумя FK, которые также могут быть PK.И Hibernate делает правильные вещи.Таким образом, вы должны вместо этого создать другую сущность, представляющую эту «ложную таблицу соединений», и отобразить ее соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...