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]
_
これを解決する方法は?
create table Book (id bigint not null, author varchar(255), name varchar(255), price double not null, type varchar(255), primary key (id))
であることを確認します。休止状態は独自の方法でid戦略を処理するようですが、どのように?@GeneratedValue(strategy=GenerationType.AUTO)
はDDLのステートメントで_auto increment
_を生成するはずですが、私はそれを見つけませんでした。見逃しましたか?strategy=GenerationType.IDENTITY
の代わりにstrategy=GenerationType.AUTO
を使用してみてください
また、間違っている可能性がありますhibernate.dialect
hibernate.dialect=org.hibernate.dialect.H2Dialect
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
_)INSERT INTO TABLE(ID, ...) VALUES (hibernate_sequence.nextval, ...)