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?
- 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? - La
@GeneratedValue(strategy=GenerationType.AUTO)
devrait générerauto increment
dans la déclaration de la DDL mais je n'ai pas trouvé. Ai-je raté?
OriginalL'auteur Guisong He | 2016-08-23
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser
strategy=GenerationType.IDENTITY
au lieu de lastrategy=GenerationType.AUTO
Aussi peut-être tort de mise en veille prolongée.le dialecte
Essayez le
strategy=GenerationType.IDENTITY
, Il fonctionne. Et le DDL clause changécreate table Reader (id bigint generated by default as identity, age integer not null, gender varchar(255), name varchar(255) not null, registeredDate timestamp, primary key (id))
. Donc, ce que la diffence entreIDENTITY
etAUTO
ici?IDENTITÉ Indique que le fournisseur de persistance doit attribuer des clés primaires de l'entité à l'aide d'une base de données de la colonne d'identité. AUTO Indique que le fournisseur de persistance devez choisir une stratégie appropriée pour la base de données particulière. Le<code>AUTO</code> stratégie de génération peut s'attendre à une base de données de ressources d'exister, ou elle peut tenter d'en créer un. Un fournisseur peut fournir de la documentation sur comment créer de telles ressources dans le cas où il ne prend pas en charge la génération de schéma ou ne peut pas créer le schéma de ressources lors de l'exécution.
OriginalL'auteur StanislavL
Hibernate 5.2.x (Printemps de Démarrage 2.x) changement de stratégie par défaut pour les séquences, si la DB est prise en charge. Ainsi, avec
strategy=GenerationType.AUTO
,hibernate_sequence
est créé, maisid
n'est pas autoincremented, à partir de cette séquence, comme doit l'être:au lieu de
(voir HHH-13268). Il existe plusieurs solutions:
@GeneratedValue
àstrategy = GenerationType.IDENTITY
spring.jpa.properties.hibernate.id.new_generator_mappings=false
(spring-boot aliasspring.jpa.hibernate.use-new-id-generator-mappings
)INSERT INTO TABLE(ID, ...) VALUES (hibernate_sequence.nextval, ...)
OriginalL'auteur GKislin