H2数据库:使用jdbcTemplate插入记录时,列“ID”不允许NULL

时间:2016-08-23 07:15:26

标签: hibernate h2

我使用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))。似乎嫌疑人以自己的方式处理了这个问题,但是怎么做?
  2. @GeneratedValue(strategy=GenerationType.AUTO)应该在DDL的声明中生成auto increment,但我没有找到。我错过了吗?

2 个答案:

答案 0 :(得分:17)

尝试使用strategy=GenerationType.IDENTITY代替strategy=GenerationType.AUTO

也可能是错误的hibernate.dialect 试试

hibernate.dialect=org.hibernate.dialect.H2Dialect

答案 1 :(得分:4)

如果DB支持一个,Hibernate 5.2.x(Spring Boot 2.x)更改序列的默认策略。因此,使用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, ...)