java JPA主键自动生成
我的主键实体如下所示
@GeneratedValue(strategy= GenerationType.TABLE)
private Long id;
当我运行时,我得到了一个错误
无法获取或更新下一个值;嵌套的异常是org。冬眠例外SqlGrameRexception:无法获取或更新下一个值
但是当我刚换到
@GeneratedValue
private Long id;
没有错误抛出。我想在oracledb上为每个表生成唯一的主键
你可以在下面搜索框中键入要查询的问题!
我的主键实体如下所示
@GeneratedValue(strategy= GenerationType.TABLE)
private Long id;
当我运行时,我得到了一个错误
无法获取或更新下一个值;嵌套的异常是org。冬眠例外SqlGrameRexception:无法获取或更新下一个值
但是当我刚换到
@GeneratedValue
private Long id;
没有错误抛出。我想在oracledb上为每个表生成唯一的主键
# 1 楼答案
身份: Autoincrement-on-demand,由于数据库内部轻量级锁定而高效,但由于hibernate采用的“事务性写后”刷新策略,在hibernate中无法很好地工作
顺序: 预先分配值以提高性能,支持良好的休眠“事务性写后”刷新策略
表(顺序): 一个或多个表可用于保存标识符序列计数器。但这意味着要用写性能换取数据库的可移植性
short summary of Auto Generation
# 2 楼答案
在将新创建的实体插入数据库时,
@GeneratedValue(strategy=GenerationType.TABLE)
告诉JPA提供者使用一个表来获取ID当使用Hibernate作为提供程序时,这将产生一个表
hibernate_sequences
,该表有两列:实体名称和已分配给该实体的最大标识。在这里,Hibernate似乎无法成功地为您的实体获取下一个ID,但很难说确切原因,因为您没有为此提供足够的信息那么,你能提供完整的stacktrace吗?另外,请将
hibernate.show_sql
属性设置为true
的日志记录,并设置适当的日志级别log4j.logger.org.hibernate.SQL=DEBUG
。如果可能的话,把日志加入你的问题也许只需检查一下您是否为Oracle配置了正确的
hibernate.dialect
。实际上,如果可能的话,也加入你的hibernate配置PS:使用Oracle生成PK的“传统”方法是使用序列(您可以让Hibernate使用
GenerationType.AUTO
猜测数据库类型的最佳策略,或者强制使用SEQUENCE
),但我假设您希望生成的数据结构与数据库无关。如果不是的话,我建议换成序列编辑:回答关于
GenerationType.AUTO
的评论。实际上,默认值是一个名为hibernate_sequence
的单一全局序列,这可能是一个问题。但是,通过如下所示的设置,您可以使用GenerationType.AUTO
,并且在数据库使用序列的情况下仍然可以控制序列的名称:换句话说,您可以为每个表使用不同的序列名,而不会失去可移植性
# 3 楼答案
JPA中有4种自动生成策略:
对于Oracle自动生成主键注释,序列和表是您的选择。基本逻辑是首先定义一个生成器,分别使用@SequenceGenerator或@TableGenerator,然后在@GeneratedValue中将生成器用作属性
以下是如何使用顺序策略的示例:
下面是一个如何使用表格策略的示例:
如果@GeneratedValue注释中没有指定生成器,则选择权将留给JPA实现
如果您正在使用现有表处理数据库,请确保在运行应用程序之前,已删除数据库中定义的序列或表表格生成器还需要在@GeneratedValue注释正常工作之前向表格插入一行
这里有一个关于how to configure primary key auto generation in JPA for Oracle database的教程