【问题标题】:Oracle db sequence with hibenate sequence带有休眠序列的 Oracle db 序列
【发布时间】:2021-01-05 21:50:09
【问题描述】:

我正在从事一个基于 oracle db 和 JPA 的项目, 我意识到应该使用序列SEQ_CASO 生成其值的列具有precision= 12

但是,在 Oracle db 中声明的序列对象中,我发现最大数字远大于 12 位数字(9999999999999...):

我想知道如果数据库中的记录数超过 12 位数字会怎样? JPA 定义的 12 个数字的精度会压垮应用吗?

【问题讨论】:

    标签: oracle hibernate spring-data


    【解决方案1】:

    回答您的主要问题:

    我想知道如果数据库中的记录数超过 12 位数字会怎样?

    考虑到您引用的代码是通过逆向工程制作的,该列可能在 Oracle 中定义为 NUMBER(12,0)(精度 12,刻度 0)。

    也就是说,当您的应用程序中的序列到达生成 13 位数字的点时,Oracle 数据库在尝试将这些数字插入您的表中时将返回以下错误:

    ORA-01438: 大于指定精度的值允许此列

    在 Oracle 中,精度和比例的定义可能很棘手,尤其是当它们没有明确定义时(即 col 被定义为 NUMBER - 没有指定精度或比例)。

    有关精度和规模的更多信息:

    What is the difference between precision and scale?

    What is the default Precision and Scale for a Number in Oracle?

    【讨论】:

      【解决方案2】:

      您不需要使用@Column 注释定义唯一的、可为空的属性。当您定义 @Id 注释时,它将成为非空且唯一的主键列。

      即使您不需要定义精度属性,它也可以正常工作。

      @Id
      @SequenceGenerator(name="SEQ_CASO",sequenceName="SEQ_CASO_PK",initialValue=1500000,allocationSize=1)
      @GeneratedValue(generator="SEQ_CASO",strategy=GenerationType.Sequence)
      @Column("ID")
      private long Id;
      

      【讨论】:

      • 感谢 Nafaz,我正在处理的这段代码来自现有项目,我认为它是通过数据库表的逆向工程制作的。但是我需要知道如果生成的 id 超过了定义精度的数字会发生什么?
      猜你喜欢
      • 2011-07-16
      • 1970-01-01
      • 2011-03-05
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多