JPA / Ebean - 使用PostgreSQL强制@Id严格增加+1

时间:2014-11-02 11:28:49

标签: java postgresql jpa ebean

我有以下型号:

public class Parameter extends Model {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long id;
}

save()创建的记录如下所示:

play=> select id from parameter;
 id
----
  1
  2
  3
  4
  5
 21
(6 rows)

有没有办法告诉JPA总是将ìd增加一个,而不是随机跳到21?

3 个答案:

答案 0 :(得分:1)

你观察到的东西(跳到21)很可能是4.0.5之前Ebean的细节。 Ebean在序列上使用'提前提取'机制。在4.0.5之后,Ebean默认切换为使用Postgres SERIAL(因此默认情况下,在4.0.5之后你不会看到Ebean / Postgres)。请参阅:https://github.com/ebean-orm/avaje-ebeanorm/issues/97

所有人都说 - '正确递增1'是你通常想要避免的东西,因为它变成了一个并发问题(避免自动增量ID事务引入争用)。当你需要'精确增加一个'语义(比如检查号码等)时,你可以提前批量创建。

答案 1 :(得分:0)

您应该可以使用@TableGeneratorallocationSize=1来实现这一目标。示例代码类似于以下内容。您需要创建一个单独的表来存储PK,这是额外的工作,但比@GeneratedValue更便携。

@TableGenerator(name="MAIN_PK_GEN", table="pk_gen", pkColumnName="GEN_NAME", valueColumnName="GEN_VALUE", pkColumnValue="MAIN_PK_GEN", allocationSize=1)
    @Id @GeneratedValue(strategy=GenerationType.TABLE, generator="MAIN_PK_GEN" )
    @Basic(optional = false)
    @Column(name = "PK")
    private Integer pk;

(但使用allocationSize=1可能效率不高)

有关分步说明,请参阅this tutorial

答案 2 :(得分:0)

如果您使用的是Oracle,请不要忘记添加 SequenceGenerator ,其allocationSize为1:

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mysequence")
    @SequenceGenerator(name = "mysequence", sequenceName = "mysequence", allocationSize = 1)
    private Long id;