#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?