Подтвердить что ты не робот

Hibernate не соблюдает поле первичного ключа MySQL auto_increment

Я пытаюсь узнать, как работает 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, предложите один из них. Я делаю прототипы, а не долгосрочные проекты, сконструированные с помощью mondo.)

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 4

Я использую следующее с 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;
}

Ответ 5

Возможно, вы захотите посмотреть: http://hibernatepojoge.sourceforge.net/

Он утверждает, что создает полностью работоспособное приложение (spring, hibernate, junit tests и т.д.), просто указывая его на БД.