【问题标题】:Problems with @GeneratedValue in the H2 databaseH2 数据库中@GeneratedValue 的问题
【发布时间】:2020-03-20 06:45:59
【问题描述】:

您好 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?

【问题讨论】:

    标签: java spring database hibernate spring-data


    【解决方案1】:

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

    正确:

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

    但我认为“@GenerateValue”会自动为我生成 id?

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

    【讨论】:

      【解决方案2】:

      您将 sql 和 hibernate 混为一谈。 @GeneratedValue 在您的 java 代码中声明,因此 hibernate 知道,当您持久化一个没有 id 的实体时,它应该由给定的 strategy 生成。

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

      【讨论】:

      • 嗯,我明白了。谢谢
      • @DominiqueRosario 没问题,如果您觉得答案有帮助,请考虑投票;>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      • 2020-06-24
      • 2014-12-17
      • 1970-01-01
      • 2018-09-29
      • 2014-10-11
      相关资源
      最近更新 更多