繁体   English   中英

JPA主键自动生成

[英]JPA primary key auto generate

我的主键实体如下所示

@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 实际上,如果可能的话,也加入你的休眠配置。

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中有4种自动生成策略:

  • 汽车
  • 身份
  • 顺序
  • 桌子

对于 Oracle 自动生成主键注释,Sequence 和 Table 是您的选择。 基本逻辑是先定义一个生成器,分别使用@SequenceGenerator@TableGenerator ,然后在@GeneratedValue 中使用生成器作为属性。

这是如何使用 Sequence 策略的示例:

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

以下是如何使用表策略的示例:

  @Id
  @TableGenerator(name="TABLE_GEN",table="T_GENERATOR", pkColumnName = "GEN_KEY", pkColumnValue = "MONITOR2012.T_JUST_FOR_TEST", valueColumnName = "GEN_VALUE", initialValue = 1, allocationSize = 1 )
  @GeneratedValue(strategy = GenerationType.TABLE, generator="TABLE_GEN")
  private long id;

如果@GeneratedValue注释中没有指定生成器,则选择将留给 JPA 实现。

如果您正在使用现有表处理数据库,请确保在运行应用程序之前在数据库中定义序列或表。 表生成器还需要您在表中插入一行,@GeneratedValue 注释才能正常工作。

这是一个关于如何在 JPA 中为 Oracle 数据库配置主键自动生成的教程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM