Спящий режим: более одного отношения, использующего один и тот же столбец соединения - PullRequest
3 голосов
/ 15 февраля 2010

Я использую устаревшую схему базы данных с составными ключами. У меня есть сущность с двумя отношениями, и один из столбцов соединения является общим.

Например, допустим, у меня есть ученик с двумя отношениями: отдел и курс. Кафедра использует столбец dept_code, а курс использует столбцы dept_code и course_code. Модель предметной области такова, что студент может принадлежать к какой-либо кафедре и еще не выбрал курс, или студент мог выбрать и кафедру, и курс. Вот как выглядит спящий режим:

<many-to-one class="Department" name="department">
  <column name="dept_code"/>
</many-to-one>

<many-to-one class="Course" name="course>
  <column name="dept_code"/>
  <column name="course_code"/>
</many-to-one> 

Проблема в том, что Hibernate не разрешает это сопоставление, если одно из отношений не помечено только для чтения с использованием insert = false и update = false.

Есть ли способ сделать обе отношения доступными для записи?

Ответы [ 2 ]

1 голос
/ 17 февраля 2010

Я понимаю, что у вас есть устаревшая БД и, следовательно, вы не можете изменить таблицы? Но если возможно, я бы вставил суррогатный ключ или новую таблицу соединений.

Если у вас нет этой опции, вы всегда можете написать собственную загрузку и сохранить SQL. Посмотрите на элементы отображения , , и . См. https://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/querysql.html главу 13.3. и следующие.

В качестве третьего варианта вы можете просто сопоставить свои сущности без этого соединения и самостоятельно выполнять методы CRUD: самостоятельно писать методы загрузки, сохранения, обновления и сохранения и обрабатывать соединения между сущностями вручную. Это можно сделать прозрачным для вашего клиентского кода. Вызывающая сторона будет просто использовать методы setDepartment и getDepartment, а ваш DAO (или любая другая концепция, которую вы используете) будет обрабатывать все остальное.

Кстати: в книге JPA / Hibernate от Manning есть полезная глава для такого рода проблем («Сохранение Java в Hibernate», глава 8 - Устаревшие базы данных и пользовательский SQL).

1 голос
/ 15 февраля 2010

Не могли бы вы попробовать следующее

1) Установите свойство not-null в коде dept_code и посмотрите, что происходит (это приемлемо?)

2) Установите отдел только для чтения и курс для записи, а в setDepartment создайте объект курса с нулевым значением кода_кода существующего кода курса и фактически используйте setCourse и посмотрите, все ли обновления идут нормально?

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