Hibernate @GeneratedValue не генерирует первичный ключ перед сохранением объекта

#hibernate

#спящий режим

Вопрос:

Я создал приложение seam с использованием Hibernate (по умолчанию) поставщика ORM. При сохранении объекта он выдает следующую ошибку:

 Caused by: java.sql.SQLException: Field 'COUNTRY_ID' doesn't have a default value
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
  

Его выбрасывают, потому что первичный ключ не генерируется Hibernate перед сохранением объекта.

 @Entity
@Table(name = "country")
public class Country implements java.io.Serializable {

private Integer countryId;
//other instance variables...

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "COUNTRY_ID", unique = true, nullable = false)
public Integer getCountryId() {
return this.countryId;
}

public void setCountryId(Integer countryId) {
this.countryId = countryId;
}
  

Когда я вношу изменения в таблицу ‘Country’, то есть создаю COUNTRY.COUNTRY_ID как AUTO_INCREMENT (база данных MySQL), тогда приведенный выше код сохраняет объект Country. Даже после попытки стратегии

 @GeneratedValue(strategy = GenerationType.IDENTITY)
  

возникает ошибка, если я не добавляю COUNTRY_ID в качестве AUTO_INCREMENT.

Итак, необходимо ли, чтобы первичные ключи автоматически увеличивались в таблице? Почему Hibernate не создает уникальный первичный ключ (используя алгоритм HiLo) перед сохранением объекта, если первичный ключ не помечен как AUTO_INCREMENT в таблице базы данных.

Заранее спасибо.

С уважением

Ответ №1:

GenerationType.AUTO означает, что hibernate выберет стратегию генерации в зависимости от возможностей базы данных: для MySQL выберет стратегию идентификации. В вашем случае укажите GenerationType.AUTO то же самое с GenerationType.ИДЕНТИФИКАЦИЯ.

В свою очередь, GenerationType .Для идентификации требуется автоматическое увеличение столбца id.

Вам следует попробовать другие стратегии, если вы хотите, чтобы hibernate присваивал значения вашему столбцу id: например, hilo. Но разрешить hibernate присваивать значения для ваших столбцов идентификаторов рекомендуется только для тестирования.

Комментарии:

1. Спасибо за входные данные. Итак, Hibernate (GenerationType. АВТОМАТИЧЕСКИ) выбирает стратегию генерации для MySQL в качестве GenerationType. ИДЕНТИФИКАТОР, и нам нужно иметь автоматическое увеличение столбца id. Но, GenerationType . ИДЕНТИФИКАТОР имеет сравнительно меньшую производительность по мере роста приложения. Какую стратегию лучше всего использовать для базы данных MySQL?