无法将生成的密钥增加1

时间:2012-05-24 00:40:32

标签: google-app-engine datanucleus

我正在使用Java和JPA进行ORM。

最初我是这样定义实体键:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;

但是这导致ids变得非常快且以不可预测的方式增长(...... 19,20,22,1003 ... 1007,1014,1015,2004 ...)

似乎与docs相矛盾,后者声明“最简单的关键字段是一个长整数值,当对象保存到数据存储区时,JPA会自动填充该值,并且该类的所有其他实例都具有唯一值第一次。长整数键使用@Id注释和@GeneratedValue(strategy = GenerationType.IDENTITY)注释“

所以我找到this单元测试,然后切换到它在那里完成的方式:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;

在更新一些GQL语句后迁移得很好,但我仍然看到密钥每次增加1000。

我应该使用GenerationType.TABLE吗?或者我应该在Long而不是Key字段上使用IDENTITY吗?

我希望在我的live(beta)应用程序中不断更改之前得到一些确定的答案。不幸的是,到目前为止我在dev env中使用的所有方案都会产生连续的密钥,因此除了部署之外,没有办法测试新的方法。

提前致谢。

1 个答案:

答案 0 :(得分:5)

在App Engine上执行连续键非常困难。文档从未声明自动生成的密钥是连续的 - 只是它们是唯一的。

应用引擎上最简单的解决方案是设计您的密钥,这样您就不需要它们是连续的。考虑到BigTable的设计方式,如果你确实有连续递增的密钥,那么每当平板电脑需要拆分时,你可能会遇到一些性能瓶颈。