我使用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策略,但是如何处理呢?
@GeneratedValue(strategy=GenerationType.AUTO)
应该在DDL的语句中生成auto increment
,但我没有发现。我错过了吗
4条答案
按热度按时间o7jaxewo1#
尝试使用
strategy=GenerationType.IDENTITY
而不是strategy=GenerationType.AUTO
也可能是错误的休眠。方言试试
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
)zed5wv103#
Hibernate 5.2.x(Sping Boot 2.x)如果DB支持序列,则更改序列的默认策略。因此,使用
strategy=GenerationType.AUTO
,hibernate_sequence
被创建,但id
不会自动递增,基于这个序列,必须是:而不是
(see HHH-13268)。有几种解决方案:
@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, ...)
up9lanfz4#
这个问题在Hibernate 5中得到了解决。6.5( Spring Boot 2.6.4),所以H2版本2.0.202(或更高)再次工作。
参考https://github.com/hibernate/hibernate-orm/pull/4524。