gpt4 book ai didi

java - JPA主键自动生成

转载 作者:太空狗 更新时间:2023-10-29 22:43:07 25 4
gpt4 key购买 nike

我的主键实体如下所示

@GeneratedValue(strategy= GenerationType.TABLE)
private Long id;

运行时出现错误

无法获取或更新下一个值;嵌套异常是 org.hibernate.exception.SQLGrammerException: 无法获取或更新下一个值

但是当我刚改成

@GeneratedValue 
private Long id;

没有错误抛出。我想在 oracle db 上为每个表生成唯一的主键。

最佳答案

@GeneratedValue(strategy=GenerationType.TABLE) 告诉 JPA 提供程序在将新创建的实体插入数据库时​​使用表来获取 ID。

当使用 Hibernate 作为提供者时,这将生成一个表 hibernate_sequences,其中有两列:实体名称和已分配给该实体的最大身份。在这里,Hibernate 似乎没有成功地为您的实体从中获取下一个 ID,但很难确切地说出原因,因为您没有为此提供足够的信息。

那么,您能否提供完整的堆栈跟踪信息?此外,请将 hibernate.show_sql 属性设置为 true 并设置正确的日志级别 log4j.logger.org.hibernate.SQL=DEBUG。如果可能,将日志加入您的问题。

也许只是检查您是否为 Oracle 配置了正确的 hibernate.dialect。实际上,如果可能的话,也加入你的 hibernate 配置。

PS:使用 Oracle 生成 PK 的“传统”方法是使用序列(您可以让 Hibernate 使用 GenerationType.AUTO 为您的数据库类型猜测最佳策略,或者使用 强制它SEQUENCE) 但我假设您希望生成的数据结构与数据库无关。如果没有,我建议改用序列。

编辑:回答 OP 关于 GenerationType.AUTO 的评论。事实上,默认是一个名为 hibernate_sequence 的全局序列,这可能是个问题。但是,通过下面所示的设置,您可以使用 GenerationType.AUTO 并在数据库使用序列的情况下仍然控制序列的名称:

@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen")
@SequenceGenerator(name="my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ")
private long id;

换句话说,您可以为每个表使用不同的序列名称,而不会失去可移植性。

关于java - JPA主键自动生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1817625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com