【问题标题】:JPA with SequenceGenerator and GeneratedValue带有 SequenceGenerator 和 GeneratedValue 的 JPA
【发布时间】:2013-12-27 17:29:52
【问题描述】:

我有一个代码,它使用 JPA 注释生成 DB 主键。DB 序列用于生成 PK.Am 使用 Oracle DB

@Id
@Column(name = "rec_id", scale = 0)
@GeneratedValue(generator = "RecIdSequence", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "RecIdSequence", sequenceName = "P_REC_ID_SEQUENCE")
public Long getRecordId() {
    return outboundPackageRecordId;
}

现在我对此的理解是:DB sequencer 返回的sequence id 用作rec_id。 这是正确的吗?

文档说:

顺序策略 序列策略由两部分组成——定义一个命名序列和在一个或多个字段中使用命名序列 更多课程。 @SequenceGenerator 注解用于定义一个 序列并接受名称、初始值(默认为 1)和 分配大小(默认为 50)。序列是全局的 应用并且可以被一个或多个领域中的一个或多个领域使用 类。 @GeneratedValue 中使用了 SEQUENCE 策略 将给定字段附加到先前定义的命名的注释 顺序:

@Entity
@SequenceGenerator(name="seq", initialValue=1, allocationSize=100) // Define a sequence - might also be in another class:
public class EntityWithSequenceId {
    // Use the sequence that is defined above:
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")
    @Id long id;
}

与 AUTO 和 IDENTITY 不同,SEQUENCE 策略生成自动 一旦新的实体对象被持久化(即之前 犯罪)。当需要主键值时,这可能很有用 早些时候。为了尽量减少到数据库服务器的往返次数,ID 是 分组分配。指定每个分配中的 ID 数量 通过 allocationSize 属性。有可能是某些ID 在给定的分配中不会使用。因此,该策略确实 不保证序列值不会有空缺。

【问题讨论】:

    标签: java oracle hibernate jpa


    【解决方案1】:

    在主键列上使用生成类型为 AUTO 而不是 SEQUENCE。

    @GeneratedValue(strategy = GenerationType.AUTO, generator = "generator")
    @SequenceGenerator(name="generator", sequenceName="DB_SEQ_NAME")
    

    【讨论】:

      【解决方案2】:

      这将使用序列P_REC_ID_SEQUENCE 中的下一个值。

      这也取决于您使用的数据库。您可以在Postgres 中定义序列,但不能在MySQL 中定义。

      如果您使用MYSQL,那么您可以使用Auto-Incremement,但您不需要定义序列。

      如果您使用ORACLE 数据库,则将序列定义为

      CREATE SEQUENCE emp_sequence
            INCREMENT BY 1
            START WITH 1
      

      现在,如果当前序列值为 100,那么下一个序列值为 101。我希望它有意义。

      【讨论】:

      • @Makky。我们正在使用 oracle DB。同样是下一个值,你的平均值由 P_REC_ID_SEQUENCE 重新调整,对吗?
      • 是的。从您的 P_REC_ID_SEQUENCE 返回的下一个值。
      猜你喜欢
      • 2013-01-23
      • 1970-01-01
      • 2019-02-24
      • 2016-01-09
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      相关资源
      最近更新 更多