当前位置: 首页 > 知识库问答 >
问题:

Spring 启动Hibernate 使用序列或标识生成实体 ID 时出现问题

夹谷飞龙
2023-03-14

我开发了带有sprint boot,jpa,hibernate和PostgreSQL的Rest API。我的目标是能够生成自动递增的 id,用于代码和使用数据库工具(如 D Beaver),而无需编写任何额外的查询来获取下一个 ID 值等。

我已创建实体用户。我尝试用两种方式生成id:

  1. 生成类型标识

使用GenerationType时。IDENTITY它成功创建名为< code>user的表,名为< code>user_id_seq的序列,并为< code>user.id列< code > nextval(' user _ id _ seq ':reg class)添加默认值。数据库中的一切都是预期的,它与数据库工具一起工作很好,但当我试图从我的API插入新行时出现问题。当试图插入新行时,hibernate执行查询

select currval('user_id_seq')

获取id值,我得到错误

org.postgresql.util.PSQLException: ERROR: invalid name syntax

因为user周围的那些引号。它应该执行

select currval('user_id_seq')

我认为这里的问题是因为我使用了表名< code>user,这是一个保留关键字,但是我希望保持这种方式,因为这种命名与其他表模式相匹配。

如果我使用注释:

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_generator")
@SequenceGenerator(name="user_generator", sequenceName = "user_id_seq", allocationSize=1)

它创建表“用户”,序列“user_id_seq”但不添加 user.id 列默认值,因此如果不指定 id 值,我无法使用数据库工具插入新行。但是使用这种生成类型我的 API 工作正常。

另外值得一提的是,我使用了< code > spring . JPA . hibernate . DDL-auto = create-drop 并每次手动删除和重新创建模式,这样就不会留下任何不必要的序列/表。

@Entity
@Table(name = "`user`")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // other properties...

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    // other getters and setters...
}

因此...有可能以某种方式将这两种方式联系起来,创造出一种可行的解决方案?我需要列的默认值,hibernate也知道如何生成这个id。

附言:在运行应用程序时,我不想更改表/实体命名或执行SQL来更正表。我相信应该有更好的方法。

共有1个答案

丁雅惠
2023-03-14

经过数小时的调试,我最终扩展了PostgreSQL82Dialect并覆盖了getIdtySelectString函数以删除表名中的引号。

 类似资料:
  • 问题内容: 我有以下映射 SACP表根据 当我尝试保存Sacp实例时,Hibernate抱怨 ORA-01438:此列允许的值大于指定的精度 即使使用Long而不是Integer,也会引发相同的错误 我该怎么解决? 问题答案: 我发现了这个 SEQ_GEN使用名为my_sequence的序列定义序列生成器。此基于序列的hilo算法使用的分配大小为20。请注意,此版本的Hibernate Annot

  • 问题内容: 我有一个具有以下定义的类: 当我们在Jboss 4.2.3上运行它时,它可以正常工作并生成正确的ID(从1000+开始) 现在我们转到jboss 7.1.1,它会生成负ID!(从-498开始,然后上升) 知道为什么会发生这种情况吗? 问题答案: 从JBoss 6.1迁移到JBoss 7.1时遇到了这个问题。 根据JBoss AS 7.1 JPA文档(https://docs.jboss

  • 我在尝试将HiberNate与SAP HANA In-Memory数据库连接时遇到了一些性能问题,该数据库不支持AUTO_INCREMENT(http://scn.sap.com/thread/3238906)。 因此,我将HiberNate设置为使用序列生成ID。 但是当我插入大量记录(例如,40000)时,Hibernate首先会生成ID。它看起来像: 只有在生成所有 ID 后,它才会开始实际

  • 问题内容: 我正在将spring,h2和liquibase与hibernate一起使用,并且试图通过以本博客文章为例为我的实体创建自定义String id生成器,但出现错误: 这是我的SequenceStyleGenerator代码: 我的实体代码: 和liquibase XML: 顺便说一句,有可能避免参数sequence_name,以便hibernate可以自行处理吗? 如果有人可以帮助我,谢

  • 问题内容: 我有一些看起来像这样的Hibernate实体(省略了getter和setter): 当我查询EntityA时,它的加载情况很好,父关联被Hibernate代理(因为它是惰性的)代替了。如果要访问父母的ID,请执行以下调用: 据我了解,该调用不应往返于数据库,因为Id存储在EntityA表中,并且代理应仅返回该值。但是,在我的情况下,这会生成一条SQL语句,该语句将提取EntityB并仅

  • 我有一个应用程序与,我第一次创建表没有问题,但当我再次启动它时,我有一个我无法解决的问题。 这是错误: 我尝试了以下方法,但未能解决问题: - - - 但我试过的方法都没有解决这个问题。我如何解决这个问题才能顺利启动应用程序?

  • 问题内容: 是首选使用“ Id”作为主键的列名还是使用“ [TableName] Id”作为命名约定? 表:帐户 主键:ID - 相对 - 表:帐户 主键:AccountId 在我所看到的实现中,似乎分成了大约50%/ 50%。每种方法的优点和缺点是什么? 跟进: 在我的数据库中使用一种约定,在代码中对我的实体使用另一种约定是否有意义?还是应该让它们保持一致?在大多数ORM中,这如何最好地工作?

  • 所以我使用IntelliJ,并使用JavaFX构建了我的应用程序。但当我开始我的主要工作时: 我得到以下错误,我不知道这些错误来自哪里。。。在我切换github上的分支并重新设置所有配置之前,一切都很正常。。。 我得到的错误: