Вопрос:
Я использую hibernate hbm2ddl для автоматической генерации схемы. Вот мой домен:
@Entity public class Reader { @Id @GeneratedValue(strategy=GenerationType.AUTO) Long id; @Column(nullable=false,unique=true) String name; @Enumerated(EnumType.STRING) Gender gender; int age; Date registeredDate = new Date(); // getter and setter … }
Когда я использую спящий режим для сохранения reader, он работает нормально, как ожидалось, так как он генерирует идентификатор для reader. Однако, когда я использую jdbcTemplate для вставки записи с чистым SQL, он сообщает об ошибке:
org.springframework.dao.DataIntegrityViolationException: StatementCallback; SQL [insert into reader(name,gender,age) values(‘Lily’,’FEMALE’,21)]; NULL not allowed for column «ID»; SQL statement:insert into reader(name,gender,age) values(‘Lily’,’FEMALE’,21) [23502-192]; nested exception is org.h2.jdbc.JdbcSQLException: NULL not allowed for column «ID»; SQL statement: insert into reader(name,gender,age) values(‘Lily’,’FEMALE’,21) [23502-192]
Как это решить?
- Я отлаживаю, чтобы найти, что DDL hb2ddl сгенерирован, является create table Book (id bigint not null, author varchar(255), name varchar(255), price double not null, type varchar(255), primary key (id)). Кажется, что hiberate обрабатывает id stratege по-своему, но как?
- @GeneratedValue(strategy=GenerationType.AUTO) должен генерировать auto increment в заявлении DDL, но я этого не нашел. Я пропустил это?
Лучший ответ:
Попробуйте использовать strategy=GenerationType.IDENTITY вместо strategy=GenerationType.AUTO
Также может быть неправильным hibernate.dialect. Попробуйте
hibernate.dialect=org.hibernate.dialect.H2Dialect