H2 base de données: NULL pas de permis pour la colonne “ID” lors de l'insertion d'enregistrement à l'aide de jdbcTemplate

J'utilise hibernate hbm2ddl pour créer le schéma automatiquement. Ici, c'est mon domaine:

@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 ...
}

Quand j'ai de l'utilisation d'hibernate pour enregistrer un reader, il fonctionne bien comme prévu car il generats un id à la reader . Cependant quand j'utilise jdbcTemplate pour insérer un enregistrement pur SQL, il signale une erreur:

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]

Comment résoudre ce problème?

  1. Je debug pour trouver que le DDL de hb2ddl généré est create table Book (id bigint not null, author varchar(255), name varchar(255), price double not null, type varchar(255), primary key (id)). Il semble que la hiberate gérer les id stratege, à sa manière, mais comment?
  2. La @GeneratedValue(strategy=GenerationType.AUTO) devrait générer auto increment dans la déclaration de la DDL mais je n'ai pas trouvé. Ai-je raté?

OriginalL'auteur Guisong He | 2016-08-23