【问题标题】:Spring JPA + Boot +Sequence Generator always 0Spring JPA + Boot +Sequence Generator 始终为 0
【发布时间】:2018-06-19 15:10:46
【问题描述】:

下面的代码只渲染一个ID为0

@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="PROJECT_SEQ_GEN")
@SequenceGenerator(name="PROJECT_SEQ_GEN", sequenceName="X.X_PROJECT_SEQ", allocationSize=1)
private long projectId;

我尝试了SEQUENCEAUTO,但结果相同。 x_project_seq.nextval 在我的 Oracle 数据库中运行良好。我想继续使用数据库中已经定义的序列。

根据 Spring 的入门指南 - Accessing Data with JPA ...

“客户的 `id 属性使用 @Id 进行注释,以便 JPA 将其识别为对象的 ID。id 属性也使用 @GeneratedValue 进行注释以指示应自动生成 ID。”

从他们的示例看来,他们所做的只是创建 new Customer 并且 ID 是自动生成的。我在这里想念什么?

【问题讨论】:

  • 您的strategy = GenerationType.AUTO 应该是strategy = GenerationType.SEQUENCE

标签: spring-boot jpa oracle11g spring-data-jpa


【解决方案1】:

您在实施时使用了错误的GenerationType。更新您的策略声明以使用 strategy = GenerationType.SEQUENCE 并简单地将 PROJECT_SEQ_GEN 用于 sequenceName 值。

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="PROJECT_SEQ_GEN")
@SequenceGenerator(name="PROJECT_SEQ_GEN", sequenceName="PROJECT_SEQ_GEN", allocationSize=1)
private long projectId;

【讨论】:

  • 我在帖子中写道,我都尝试过(基于我在其他帖子中阅读的一些答案)
【解决方案2】:

花了我整个上午,但我终于解决了这个问题。

我使用 Hibernate 工具自动生成 POJO,并且所有注释都放置在方法级别,但是,Spring 建议(需要?)它们在字段级别。您也不能只将 Id 注释移动到字段级别,因为它要么是一个,要么是另一个。所以我按照this 的回答来自定义Hibernate 工具,以在字段级别生成带有注释的POJO。

现在一切都好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 2021-05-29
    • 2019-02-07
    • 2020-04-19
    • 1970-01-01
    • 2017-03-28
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多