Ответ 1
Я считаю, что вы хотите GenerationType.IDENTITY
. MySql не использует таблицу или последовательность для генерации значения Id.
Я пытаюсь узнать, как работает 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.)
Я считаю, что вы хотите GenerationType.IDENTITY
. MySql не использует таблицу или последовательность для генерации значения Id.
Я написал это в комментарии в соответствии с принятым ответом, но они не отображаются по умолчанию, поэтому я повторно отправлю его в качестве ответа.
Я использовал файл hibernate.cfg.xml с веб-сайта чувака, и он имел это:
<property name="hibernate.hbm2ddl.auto">create</property>
Это заставило систему воссоздавать мою таблицу каждый раз, когда я запускал свое приложение. Комментируя это, проблема решена.
Другие два ответа о различных способах создания идентификаторов верны. Моя оригинальная проблема Симптом, казалось, делала с генерацией идентификатора, но фактическая причина была неправильной конфигурацией.
Я думаю, что GenerationType.AUTO прав, как is < id... > < generator class= "native" / > </id>
Выбор соответствующей стратегии для конкретной базы данных.
http://www.hibernate.org/hib_docs/ejb3-api/javax/persistence/GenerationType.html
http://www.hibernate.org/hib_docs/reference/en/html/mapping.html
Я использую следующее с 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;
}
Возможно, вы захотите посмотреть: http://hibernatepojoge.sourceforge.net/
Он утверждает, что создает полностью работоспособное приложение (spring, hibernate, junit tests и т.д.), просто указывая его на БД.