带有SequenceGenerator和GeneratedValue的JPA

时间:2013-12-10 09:19:34

标签: java oracle hibernate 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 sequencer返回的序列id用作rec_id。 这是对的吗?

DOC说:

  

序列策略       序列策略由两部分组成 - 定义命名序列并在一个或多个字段中的一个或多个字段中使用命名序列   更多课程。 @SequenceGenerator注释用于定义a   序列并接受名称,初始值(默认值为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可能是有可能的   在给定的分配中将不会被使用。因此,这种策略确实如此   不保证序列值不会有间隙。

2 个答案:

答案 0 :(得分:0)

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

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

如果您使用MYSQL,则可以使用Auto-Incremement,但无需定义序列。

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

CREATE SEQUENCE emp_sequence
      INCREMENT BY 1
      START WITH 1

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

答案 1 :(得分:0)

使用生成类型作为AUTO代替主键列上的SEQUENCE。

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