我正在使用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中使用的所有方案都会产生连续的密钥,因此除了部署之外,没有办法测试新的方法。
提前致谢。
答案 0 :(得分:5)
在App Engine上执行连续键非常困难。文档从未声明自动生成的密钥是连续的 - 只是它们是唯一的。
应用引擎上最简单的解决方案是设计您的密钥,这样您就不需要它们是连续的。考虑到BigTable的设计方式,如果你确实有连续递增的密钥,那么每当平板电脑需要拆分时,你可能会遇到一些性能瓶颈。