Как изменить автоматически генерируемый серийный номер Hibernate? - PullRequest
3 голосов
/ 11 января 2011

Я использую Hibernate (JPA) с База данных Derby - мой сервер приложений Jboss 6.0 .Я должен предварительно заполнить таблицу 50000 информацией о сотрудниках, и для этого я использовал отдельную программу JDBC.Теперь из моего приложения мне также нужно вставить информацию о новом сотруднике на лету, в ту же таблицу, и в то время я использую JPA (так как он работает в контейнере приложения).

Мой класс Employeeявляется компонентом Entity и имеет столбец " Id ", являющийся первичным ключом с аннотацией " @ GeneratedValue (стратегии = авто) ", так что Hibernate вычисляет соответствующий серийный номер для первичного ключа(т. е. столбец идентификатора).

Теперь проблема в том, что Hibernate всегда запускает этот запущенный сериал с «1», даже если в таблице Employee уже есть записи.Таким образом, из приложения, когда я пытаюсь вставить новую запись, используя Entitymanager :: persist () , я всегда получаю ограничение ограничения ошибка типа " дубликат ключазначение в ограничении уникального или первичного ключа или уникальном индексе".Это потому, что hibernate пытается вставить новую запись с Id = 1 , где у меня уже есть запись в этой таблице с Id = 1.

Мой вопрос

а) как я могу обновить кеш Hibernate'e, чтобы мой рабочий серийный номер для столбца «Id» можно было соответственно скорректировать?Я понимаю, что это будет варьироваться от БД к БД - но возможно ли это вообще ?

б) Есть ли другой способ добиться того же?

в) ЕслиЯ пишу отдельную программу JPA для выполнения массовой вставки (т.е. предварительного заполнения), а затем запускаю свое приложение Jboss, сможет ли Hibernate определить правильный «работающий серийный номер», нет?

Заранее спасибо за любые предложения,- Кунталь

Ответы [ 2 ]

2 голосов
/ 11 января 2011

а) как я могу обновить кеш Hibernate'e, чтобы мой рабочий серийный номер для столбца "Id" мог быть соответственно скорректирован?Я понимаю, что это будет варьироваться от БД к БД - но возможно ли это вообще?

б) Есть ли другой способ добиться того же?

  • @ TableGenerator

Вы можете сгенерировать первичный ключ, используя @TableGenerator, который генерирует следующий идентификатор в соответствии со значением в таблице, содержащей два поля tableName и соответствующий идентификатор, и обновляет его соответствующим образом после вставки.

Он отвечает за поддержание правильной последовательности, вы можете изменить начальное значение и т. Д.

@TableGenerator(name = "TABLE_GEN", table = "ID_GEN", pkColumnName = "GEN_NAME", valueColumnName = "GEN_VAL", pkColumnValue = "PERSON_ID", initialValue = 1, allocationSize = 1)
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
private int id;

c) Если я напишу отдельную программу JPA, чтобы выполнить массовую вставку (т.е. предварительное заполнение) изатем запустите мое приложение Jboss, сможет ли Hibernate определить правильный «работающий серийный номер», нет?

Итак, в конце создайте два генератора для: 1) приложения и 2) автономной программы, потребляющей обычныетаблица для генерации идентификатора, поэтому не будет двойного значения ключа в ограничении уникального или первичного ключа или уникального индекса .

0 голосов
/ 11 января 2011

Для настройки кэша используется файл hibernate.cfg.xml. Имя в теге свойства должно быть hibernate.cache.provider_class для активации кэша второго уровня. Мы можем использовать свойство hibernate.cache.use_second_level_cache, которое позволяет активировать и деактивировать кэш второго уровня. По умолчанию кэш второго уровня активирован и использует EHCache.

Услуги по тестированию программного обеспечения

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