具有SequenceGenerator和GeneratedValue的JPA

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

@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定序器返回的序列ID用作rec_id。 它是否正确?

DOC说:

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

@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不会被使用。 因此,这种策略并不能保证序列值不会有间隙。


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

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

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

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

CREATE SEQUENCE emp_sequence
      INCREMENT BY 1
      START WITH 1

现在,如果当前的序列值是100,那么下一个将是101.我希望它是有道理的。

链接地址: http://www.djcxy.com/p/90891.html

上一篇: JPA with SequenceGenerator and GeneratedValue

下一篇: How can a I create an field on my class thats autoIncremented from zero to 255