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

kh212irz  于 2023-04-30  发布在  其他
关注(0)|答案(4)|浏览(215)

我使用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))。看起来hiberate以自己的方式处理id策略,但是如何处理呢?

  1. @GeneratedValue(strategy=GenerationType.AUTO)应该在DDL的语句中生成auto increment,但我没有发现。我错过了吗
o7jaxewo

o7jaxewo1#

尝试使用strategy=GenerationType.IDENTITY而不是strategy=GenerationType.AUTO
也可能是错误的休眠。方言试试

hibernate.dialect=org.hibernate.dialect.H2Dialect
3lxsmp7m

3lxsmp7m2#

如果您使用的是H2依赖版本:“2.0.202”或更高版本,其他两种方法可能有效。
1:使用H2版本:“1.4.200”('com.h2数据库:h2:1。4.200 ')
2:追加“;MODE=LEGACY”到JDBC url(test case -> jdbc:h2:mem:test;MODE=LEGACY

zed5wv10

zed5wv103#

Hibernate 5.2.x(Sping Boot 2.x)如果DB支持序列,则更改序列的默认策略。因此,使用strategy=GenerationType.AUTOhibernate_sequence被创建,但id不会自动递增,基于这个序列,必须是:

create table users (id integer not null, ...)

而不是

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

(see HHH-13268)。有几种解决方案:

  • @GeneratedValue更改为strategy = GenerationType.IDENTITY
  • set spring.jpa.properties.hibernate.id.new_generator_mappings=false(spring-boot alias spring.jpa.hibernate.use-new-id-generator-mappings
  • 使用nextval插入:INSERT INTO TABLE(ID, ...) VALUES (hibernate_sequence.nextval, ...)
up9lanfz

up9lanfz4#

这个问题在Hibernate 5中得到了解决。6.5( Spring Boot 2.6.4),所以H2版本2.0.202(或更高)再次工作。
参考https://github.com/hibernate/hibernate-orm/pull/4524

相关问题