有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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吗


共 (2) 个答案

  1. # 1 楼答案

    您必须使用@GeneratedValue(strategy = GenerationType.IDENTITY)@GeneratedValue(strategy = GenerationType.SEQUENCE),并确保在数据库级别上有索引或序列。此外,在使用自动生成的ID时,插入时不要显式指定它们

    正确:

    INSERT INTO task(description) VALUES('go to the gym');
    

    but I thought the "@GenerateValue" automatically generate the id's for me?

    这不是正确的假设,Hibernate只使用db提供的ID。要使其正常工作,您需要为主键列创建索引/序列

  2. # 2 楼答案

    你把sql和hibernate搞混了@GeneratedValue在java代码中声明,这样hibernate就知道,当您持久化一个没有id的实体时,它应该由给定的strategy生成

    另一方面,您试图在不传递主键的情况下使用sql进行插入,因此明确地说,应该是NULL,这显然违反了约束