【问题标题】:How to implement auto-increment field other than id field?如何实现除 id 字段以外的自增字段?
【发布时间】:2020-12-29 22:21:22
【问题描述】:

我想实现一个除 id 字段以外的自增字段,它以 1 开头并顺序增加 1。

代码示例:

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
private String id; //Id primary key

@Column(name = "request_number", nullable = false, unique = true, updatable = false, insertable = false)
@GeneratedValue(generator = "sequence", strategy = GenerationType.AUTO)
private Long requestNumber; //Talking about this

所以,这里requestNumber 应该在每次创建对象时自动增加。这应该会依次增加。

示例:第一个条目的requestNumber 将以1 开头,下一个requestNumber 将分配为2so on...

我知道这可以通过 java 代码实现,但我正在寻找 JPA 提供这样的灵活性。

【问题讨论】:

    标签: java sql sql-server hibernate jpa


    【解决方案1】:

    你必须在你的类(或字段)上声明一个@SequenceGenerator注解:

    @SequenceGenerator(sequenceName = "MY_DB_SEQUENCE", name = "sequence")
    public class MyClass {
        // keep as is
    }
    

    请注意,@GeneratedValue 上的 generator = "sequence" 指向带有 name = "sequence"@SequenceGenerator

    【讨论】:

      【解决方案2】:

      @GeneratedValue 仅用于简单的主键,根据 javadoc:

      GeneratedValue 注释可以与 Id 注释一起应用于实体或映射超类的主键属性或字段。仅需要简单主键支持使用 GeneratedValue 注释。派生主键不支持使用 GeneratedValue 注释。

      如果您想在 JPA 中执行此操作,您可以定义 @PrePersist 方法,例如:

      @PrePersist
      void doPrePersist() {
          // Use EntityManager to create a native query
          // read next value from a sequence
          // set the field value
      }
      

      另一种选择是将数据库列定义为IDENTITY,但这将处理 JPA 之外的自动递增,例如在实体持久化操作期间,实体字段将不可插入且值将不可见。

      请注意,SQL Server 和大多数数据库不保证序列中不会出现间隙。当增加序列的事务被回滚时,序列的值不是,所以你可以最终得到:1、2、4、5、6、10,...

      【讨论】:

        猜你喜欢
        • 2011-06-11
        • 2020-02-22
        • 2014-04-24
        • 1970-01-01
        • 2012-05-12
        • 1970-01-01
        • 2012-09-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多