Hibernate: Вставить новую строку, изменив часть первичного ключа составного идентификатора? - PullRequest
0 голосов
/ 14 июля 2011

Я пытаюсь вставить новые строки в базу данных, но Hibernate не может распознать, что мои объекты должны быть вставлены.У меня есть таблица Sponsor, таблица Course и таблица SponsorCourse, которая является пересечением между ними.Первичный ключ SponsorCourse является составным идентификатором класса SponsorCoursePK, который содержит два целых числа: первичный ключ спонсора и первичный ключ курса.SponsorCoursePK реализует функции equals () и hashcode ().

Моя цель - полная копия таблицы Course, включая все ее строки SponsorCourse.

  • Сначала я запрашиваю у Hibernate список SponsorCourses, связанных с существующей строкой Course.
  • Затем я создаю новый объект Course и фиксирую его в базе данных.(По устаревшим причинам, объекты Course не управляются Hibernate).
  • Далее я перебираю список SponsorCourses, который Hibernate дал мне для старого курса, и изменяю часть первичного ключа SponsorCourse, в которой хранится идентификатор курсаот старого courseid к id вновь созданного курса.
  • Далее я вызываю saveOrUpdate, чтобы попытаться заставить Hibernate создать новые строки.

Когда я смотрю на посылки SQL Hibernate, не существует операторов «вставки»: Hibernate не может распознать, что мои новые объекты «грязные» и их нужно вставить, даже если я изменил частьпервичного ключа.Если я изменю любое другое значение SponsorCourse, Hibernate распознает объект как грязный и вставит новую строку.

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

Документов Hibernate, в частности главы 8.4 (составные идентификаторы) и главы 10 (обсуждающие изменение объектов) справочника Hibernate 3.0, было недостаточно, чтобы помочь мне понять.

Ожидаю ли я что-то не так, думая, что могу изменить первичный ключ объекта, извлеченного Hibernate, и думая, что он вставит новую строку?Должен ли я всегда создавать свои собственные, новые объекты в такой ситуации?Или это проблема уникальности при попытке принудительной вставки путем изменения части первичного ключа, который является составным идентификатором?

Спасибо.Наверное, очевидно, я новичок в рамках.

1 Ответ

0 голосов
/ 14 июля 2011

Я бы попробовал следующее:

  1. Session.evict () постоянный объект
  2. Изменение идентификатора
  3. Сохраните его, используя Session.replicate ()

http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Session.html

Удачи

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