当前位置: 首页 > 面试题库 >

JPA主键自动生成

丁子石
2023-03-14
问题内容

我的主键实体如下所示

@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。如果可能,将日志加入您的问题。

也许只是检查您是否hibernate.dialect为Oracle 配置了正确的文件。实际上,如果可能的话,也加入您的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;

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



 类似资料:
  • 我想创建一个复合主键,其中一个字段是自动生成的(JPA)。我能这么做吗?有没有可能从spring环境中得到一个生成器? null

  • 我有Spring Boot应用程序,我使用JPA层与PostgreSQL交谈。我有一个类型UUID的非主键,我想在调用保存方法时自动生成。我用@GeneratedValue注释了属性,但插入时列值为空。 我还创建了列: 在这种情况下如何自动生成非主要UUID值?

  • 我遇到了一个问题,我找不到任何关于Android空间和自动生成主键的文档。 我有一个实体类,看起来有点像这样: 当我手动设置id时,这是正常的,但是当我不设置主键时,我得到一个关于主键为空的错误。看着自动生成的文件,我看不到它会自动增加主键的任何地方。 所以我想我的问题是:你能用setter自动生成私有成员的主键吗,或者我需要在setter中手动自动生成我的键吗?

  • 本文向大家介绍如何获取自动生成的(主)键值?相关面试题,主要包含被问及如何获取自动生成的(主)键值?时的应答技巧和注意事项,需要的朋友参考一下 insert 方法总是返回一个 int 值 ,这个值代表的是插入的行数。 如果采用自增长策略,自动生成的键值在 insert 方法执行完后可以被设置到传入 的参数对象中。 示例:

  • 要用jooq创建一张唱片,我说 这将引发一个id为null的约束冲突异常。如果我设置一个id(如 我没有得到异常,但postgres不会自动生成值。 http://www.postgresql.org/docs/current/static/datatype-numeric.html#datatype-serial的postgres文档指出“在INSERT中省略SERIAL列,或者指定DEFAUL

  • 在spring data jpa应用程序中,我创建了一个带有@entity注释的模型。我正在将该模型数据保存到表中。我正在自动递增主键。但当我将数据保存到表中时,它不是按顺序自动递增的。 类文件 桌子 谁能告诉我为什么主键没有按顺序自动递增?为什么它不需要2,3,4......