Как предотвратить ненужный выбор при вставке? - PullRequest
5 голосов
/ 25 июня 2011

У меня есть следующий сценарий (в Java / Hibernate):

  • У меня есть два класса сущностей: X и Y. X имеет ассоциацию @ManyToOne с Y, которая не является каскадной.
  • Я создаю (неуправляемый) экземпляр x из X и (неуправляемый) экземпляр y из Y и заполняю ссылку на y в x.Единственное поле y, которое заполняется, - это первичный ключ.
  • У объекта y уже есть соответствующая строка в базовой базе данных, но объект x является новым.
  • Я сохраняю объект x.

Когда я выполняю этот сценарий, я ожидаю увидеть один запрос: INSERT x.Однако в действительности Hibernate выполняет ДВА запроса:

  • SELECT y
  • INSERT x

Более того, я также заметил, что после сохраненияx, ссылка на y фактически не становится управляемой, и в сеансе нет экземпляра Y!Итак, почему вообще выполняется SELECT для y?Есть ли способы предотвратить такое поведение?

1 Ответ

2 голосов
/ 30 июня 2011

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

Y y = (Y) session.load(Y.class, pk);

Это не извлекает Y из базы данных, вместо этого он загружает прокси, состоящий только из упомянутого вами pk.

Тогда присвоение y x и сохранение x будет вести себя так, как вы ожидаете.

...