Смешанный суррогатный композитный ключ вставка в JPA 2.0, PostgreSQL и Hibernate 3.5

StackOverflow https://stackoverflow.com/questions/2749923

Вопрос

Во -первых, мы используем JPA 2.0 и Hibernate 3.5 в качестве поставщика постоянств в базе данных PostgreSQL.

Мы успешно используем последовательность базы данных с помощью аннотаций JPA 2.0 в качестве автоматического значения для однопочного поля-саррогата-Keys, и все работают нормально.

Теперь мы внедряем двустороннюю базу данных, которая требует смешанного ключа следующим образом:

Table 1:
id             (pk, integer, auto-generated-sequence)
validTimeBegin (pk, dateTime)
validTimeEnd   (dateTime)
firstName      (varChar)

Теперь у нас есть проблема. Вы видите, если мы INSERT новый элемент, поле id Авто автоматизируется, и это нормально. Только если мы хотим UPDATE Поле в рамках этой схемы, тогда мы должны изменить validTimeBegin столбец без изменения id-field и вставьте его как новый ряд, как так:

Перед обновлением строки:

|---|-------------------------|-------------------------|-------------------|
| id|      validTimeBegin     |       validTimeEnd      |     firstName     |
|---|-------------------------|-------------------------|-------------------|
|  1| 2010-05-01-10:00:00.000 |                    NULL |            Gerald |
|---|-------------------------|-------------------------|-------------------|

После обновления строки, происходящего точно в 2010-05-01-10: 35: 01.788 Серверное время:

(we update the person with the id:1 to reflect his new first name...)
|---|-------------------------|-------------------------|-------------------|
| id|      validTimeBegin     |       validTimeEnd      |     firstName     |
|---|-------------------------|-------------------------|-------------------|
|  1| 2010-05-01-10:00:00.000 | 2010-05-01-10:35:01.788 |            Gerald |
|---|-------------------------|-------------------------|-------------------|
|  1| 2010-05-01-10:35:01.788 |                    NULL |             Jerry |
|---|-------------------------|-------------------------|-------------------|

Таким образом, наша проблема в том, что это вообще не работает, используя автоматическую последовательность для поля id Потому что при вставке новой строки, идентификатор всегда создан автоматически, хотя он действительно является частью составного ключа, который иногда должен вести себя по-разному.

Итак, мой вопрос: есть ли способ сказать Hibernate через JPA, чтобы остановить автоматическое генерирование id-field В случае, если я хочу генерировать новое разнообразие одного и того же человека и продолжить, как обычно, в любом другом случае, или мне нужно взять на себя все идентификационное поколение с помощью пользовательского кода?

Заранее спасибо, Джеральд

Это было полезно?

Решение

Итак ... какое -то время прошло сейчас без каких -либо комментариев, и теперь я уверен, что этого невозможно сделать. На самом деле это одна из причин, по которой разработчики начинают генерировать свои собственные уникальные ключи для баз данных через свои собственные идентификаторы на стороне приложения. Таким образом, база данных никогда не знает о такой вещи, как суррогатный ключ; Это просто получает это.

Кстати: мы решили нашу проблему, внедрив наши собственные методы для задачи обновления таких строк. Эти методы теперь или маппер и ни в коем случае не соответствуют JPA 2.0, но JPA просто не поддерживает аннотацию для такого поведения.

Другие советы

Afaik, ваше поля идентификатора не является идентификатором в том смысле, поскольку Hibernate это понимает. Если бы я мог предложить другое решение, учитывая тот факт, что по сути вы просто хотите реализовать журнал модификации базы данных:

  • Шаг 0: Используйте ID только в качестве первичного ключа в Hibernate. Используйте составной первичный ключ в Postgres.
  • Шаг 1: Добавьте фильтры в Hibernate, которые автоматически фильтруют все строки, имеющие набор ValdEndTime.
  • Шаг 2: Добавьте оператор по индивидуальному обновлению в Hibernate, который вместо этого выполняет вставку.
  • Шаг 3: Добавьте триггер в PostgreSQL, который автоматически устанавливает время окончания.
  • Шаг 4: Создайте ограниченный индекс на Postgres для более быстрых поисков Hibernate.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top