H2数据库中@GeneratedValue的java问题
你好,StackOverflow社区,我对注释@GenerateValue
有问题。我希望JPA为我的ID列生成值。但我还有一个专栏,人们可以在那里写一些任务(待办事项列表)
我的代码如下所示:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
我有一个SQL数据文件,它在我的h2数据库的开头写入一些数据:
INSERT INTO task VALUES(1, 'go to the gym');
INSERT INTO task VALUES(2, 'eat with tom');
INSERT INTO task VALUES(3, 'meetup');
INSERT INTO task VALUES(4, 'doing some homeworks');
INSERT INTO task VALUES(5, 'doing some exercise');
INSERT INTO task VALUES(6, 'studying with Mat');
我的问题是,当我删除SQL数据文件上的整数值时,我的编译器总是说我必须为任务声明一个id,但我认为@GenerateValue
会自动为我生成id吗
# 1 楼答案
您必须使用
@GeneratedValue(strategy = GenerationType.IDENTITY)
或@GeneratedValue(strategy = GenerationType.SEQUENCE)
,并确保在数据库级别上有索引或序列。此外,在使用自动生成的ID时,插入时不要显式指定它们正确:
这不是正确的假设,Hibernate只使用db提供的ID。要使其正常工作,您需要为主键列创建索引/序列
# 2 楼答案
你把sql和hibernate搞混了
@GeneratedValue
在java代码中声明,这样hibernate就知道,当您持久化一个没有id的实体时,它应该由给定的strategy
生成另一方面,您试图在不传递主键的情况下使用sql进行插入,因此明确地说,应该是
NULL
,这显然违反了约束