2015-05-27 2 views
0

Я пытаюсь смоделировать схему решения переходных операций в Hibernate, и я не уверен, как получить граф объекта и поведение, которые я хочу от модели.Что такое правильный CascadeType в аннотации @ManyToMany Hibernate?

Структура таблицы использует корреляционную таблицу (многие-ко-многим), чтобы создать списки пользователей для работы:

Operation  OperationUsers  Users 
op_id   op_id    user_id 
...   user_id    ... 

При моделировании настойчивый класса Operation.java используя спящий режим аннотаций, я создал:

@ManyToMany(fetch=FetchType.LAZY) 
@JoinColumn(name="op_id") 
public List<User> users() { return userlist; } 

до сих пор, у меня есть следующие вопросы:

  1. Когда пользователь удален сюда m список, как мне избежать Hibernate
    удаление пользователя из таблицы Users? Его следует просто удалить
    из таблицы корреляции, а не таблицы Users. Я не вижу действительного CascadeType для этого.
  2. Должен ли я добавить что-нибудь еще в тело метода?
  3. Нужно ли добавлять дополнительные аргументы аннотации?
  4. Я ожидаю, что сделаю это без futzing с классом User. Пожалуйста, скажите мне, что мне не нужно возиться с User.java!

Возможно, я задумываюсь над этим, но это характер обучения ... Спасибо за любую помощь, которую вы можете предложить!

ответ

0

Оказалось, что конкретный ответ на мой основной вопрос (№ 1 и основная тема): «Не указывайте какой-либо CascadeType в свойстве».

Ответ упомянут sorta сбоку в the answer to this question.

0

Из документации:

Hibernate определяет и поддерживает следующие состояния объекта:

* Transient - объект является временным, если он только что был создан экземпляр с помощью нового оператора, и это не связано с сеансом Hibernate. Он не имеет постоянного представления в базе данных и не присвоено значение идентификатора. Временные экземпляры будут уничтожены сборщиком мусора, если приложение больше не содержит ссылку. Используйте сеанс Hibernate, чтобы сделать объект постоянным (и пусть Hibernate позаботится о операторах SQL, которые должны быть выполнены для этого перехода).

* Постоянный - постоянный экземпляр имеет представление в базе данных и значение идентификатора. Это может быть просто сохранено или загружено, однако оно по определению входит в сферу сеанса. Hibernate будет обнаруживать любые изменения, сделанные для объекта в постоянном состоянии, и синхронизировать состояние с базой данных, когда блок работы завершается. Разработчики не выполняют инструкции вручную UPDATE или DELETE, когда объект должен быть временным.

* Отдельно - отдельный объект - это объект, который был постоянным, но его сеанс был закрыт. Ссылка на объект по-прежнему действительна, конечно, и отдельный элемент может быть даже изменен в этом состоянии. Отключенный экземпляр может быть повторно подключен к новому сеансу в более поздний момент времени, делая его (и все изменения) постоянным снова. Эта функция позволяет использовать модель программирования для длительных рабочих единиц, для которых требуется время мышления пользователя. Мы называем их транзакциями приложений, т. Е. Единицей работы с точки зрения пользователя.

Как объяснено в this answer, вы можете открепить свой объект с помощью Session.evict(), чтобы предотвратить спящий режим с обновлением базы данных или просто клонировать его и внести необходимые изменения на копии.

+0

Когда я говорю 'operation.addUser (aUser)' Я хочу, чтобы Hibernate выполнял 'insert в values_table значения (op_id, user_id)', и когда я говорю 'operation.removeUser (aUser)' Я хочу, чтобы Hibernate выполнял 'delete from corre_table, где op_id =? и user_id =? '. Чего я хочу избежать: 'delete from user where user_id =?'. – user1944491

Смежные вопросы