我有以下型号:
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?
答案 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)
您应该可以使用@TableGenerator
和allocationSize=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;