Hibernate не уважает поле первичного ключа MySQL auto_increment - PullRequest
19 голосов
/ 24 февраля 2009

Я пытаюсь узнать, как работает Hibernate, и сталкиваюсь с почти неприемлемой кривой обучения. Я не вижу, как заставить Hibernate соблюдать политику auto_increment для моих объектов. Вместо этого он перезаписывает записи в базе данных существующими идентификаторами, начиная с 1.

У меня есть простой Foo объект, поддерживаемый таблицей MySQL, определенной следующим образом:

CREATE TABLE `Foo` (
  `fooId` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`fooId`),
)

Я подтвердил, что вставка нескольких объектов Foo вручную с помощью SQL (insert into Foo values();) делает правильные вещи.

Мой класс Java имеет идентификатор, указанный с помощью таких аннотаций:

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="fooId")
private Integer id;

Затем я выполняю некоторый тестовый код, который просто создает экземпляры объектов Foo и сохраняет их в базе данных (используя session.save(obj)). Кажется, что он использует свою собственную последовательность первичных ключей, начиная с единицы, и не рассматривает политику ключей таблицы. Он переписывает все, что там было.

Я пробовал варианты с битом @GeneratedValue (используя все возможные стратегии, исключая скобки в скобках). Кто-то даже предложил полностью отказаться от GeneratedValue. Ничто не похоже на работу.

Я что-то упускаю? Что мне не хватает? Hibernate действительно такой сложный?

(Если у кого-нибудь есть альтернативный вариант сохранения базы данных Java, предложите один. Я делаю прототипы, а не долгосрочные моноинженерные проекты.)

Ответы [ 5 ]

28 голосов
/ 24 февраля 2009

Я верю, что вы хотите GenerationType.IDENTITY. MySql не использует таблицу или последовательность для генерации значения Id.

5 голосов
/ 03 марта 2009

Я написал это в комментарии под принятым ответом, но они не показываются по умолчанию, поэтому я опубликую его как ответ.

Я использовал файл hibernate.cfg.xml с веб-сайта какого-то чувака, и он имел следующее:

<property name="hibernate.hbm2ddl.auto">create</property>

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

Два других ответа о различных способах создания идентификаторов верны. Симптом моей первоначальной проблемы , казалось, имел отношение к генерации идентификатора, но настоящей причиной была неверная конфигурация.

2 голосов
/ 02 марта 2009

Я думаю, что GenerationType.AUTO прав, как и <генератор класса = "нативный" />

Выбирает подходящую стратегию для конкретной базы данных.

http://www.hibernate.org/hib_docs/ejb3-api/javax/persistence/GenerationType.html

http://www.hibernate.org/hib_docs/reference/en/html/mapping.html

1 голос
/ 03 марта 2009

Я использую следующее с auto_increment, работает отлично:

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "db_id", unique = true, nullable = false)
public Long getDbId() {
    return this.dbId;
}

public void setDbId(Long dbId) {
    this.dbId = dbId;
}
0 голосов
/ 17 марта 2009

Возможно, вы захотите взглянуть на: http://hibernatepojoge.sourceforge.net/

Он утверждает, что создает полностью работающее приложение (Spring, Hibernate, тесты Junit и т. Д.), Просто указав его в БД.

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