web-dev-qa-db-ja.com

H2データベース:jdbcTemplateを使用してレコードを挿入する場合、列「ID」にNULLは許可されません

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

Hibernateを使用してreaderを保存すると、readerにidを生成するため、期待どおりに機能します。ただし、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]
_

これを解決する方法は?

  1. デバッグして、生成されたhb2ddlのDDLがcreate table Book (id bigint not null, author varchar(255), name varchar(255), price double not null, type varchar(255), primary key (id))であることを確認します。休止状態は独自の方法でid戦略を処理するようですが、どのように?
  2. @GeneratedValue(strategy=GenerationType.AUTO)はDDLのステートメントで_auto increment_を生成するはずですが、私はそれを見つけませんでした。見逃しましたか?
15
Guisong He

strategy=GenerationType.IDENTITYの代わりにstrategy=GenerationType.AUTOを使用してみてください

また、間違っている可能性がありますhibernate.dialect

hibernate.dialect=org.hibernate.dialect.H2Dialect
21
StanislavL

Hibernate 5.2.x(Spring Boot 2.x)は、DBがサポートしている場合、シーケンスのデフォルト戦略を変更します。したがって、_strategy=GenerationType.AUTO_を使用すると、_hibernate_sequence_が作成されますが、idは、このシーケンスに基づいて、次のように自動インクリメントされません。

_create table users (id integer not null, ...) 
_

の代わりに

_create table table_name(id int default hibernate_sequence.nextval primary key, ...);
_

HHH-13268 を参照)。いくつかの解決策があります。

  • _@GeneratedValue_を_strategy = GenerationType.IDENTITY_に変更します
  • セット_spring.jpa.properties.hibernate.id.new_generator_mappings=false_(スプリングブートエイリアス_spring.jpa.hibernate.use-new-id-generator-mappings_)
  • nextvalで挿入:INSERT INTO TABLE(ID, ...) VALUES (hibernate_sequence.nextval, ...)
7
GKislin