首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何预留一组主键标识用于预加载引导数据

如何预留一组主键标识用于预加载引导数据
EN

Stack Overflow用户
提问于 2010-04-09 17:10:15
回答 2查看 1.2K关注 0票数 1

我们希望为所有表保留一组主键标识符(例如1-1000),以便我们可以使用预加载的系统数据引导系统。

我们所有的JPA实体类都有以下主键定义。

代码语言:javascript
复制
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false, insertable = false, updatable = false)
private Integer id;

有没有办法告诉数据库应该从1000开始递增(即客户特定的数据将从1000开始)。我们在我们的环境中支持(h2, mysql, postgres),我更喜欢一个可以通过JPA和Hibernate的逆向工程工具驱动的解决方案。

让我知道这是不是正确的方法

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-09 17:30:20

您可以尝试使用TABLE策略,而不是IDENTITY。出自Hibernate一书:

与Hibernate的hilo策略非常相似,TABLE依赖于一个数据库表,该表保存最后生成的整数主键值,每个生成器映射到该表中的一行。每行有两列:pkColumnNamevalueColumnNamepkColumnValue将每一行分配给一个特定的生成器,值列保存最后检索到的主键。持久性提供程序在每个循环中最多分配allocationSize整数。

这里是an example,有更多解释。和一个更复杂的example for setting the initial value

您还可以尝试使用在orm.xml中定义的自定义序列生成器,如下所示:

代码语言:javascript
复制
<sequence-generator name="mySequenceGenerator"
  sequence-name="MY_SEQUENCE"
  initial-value="123"
  allocation-size="20"/>

声明可以使用初始值为123的名为MY_SEQUENCE的数据库序列作为数据库标识符生成的源,并且持久化引擎每次需要标识符时都应获取20个值。(不过请注意,Hibernate注释在编写时会忽略initialValue设置。)

要将此标识符生成器应用于特定实体,请使用其名称:

代码语言:javascript
复制
@Entity
class name MyEntity {
  @Id @GeneratedValue(generator = "mySequenceGenerator")
  String id;
}
票数 1
EN

Stack Overflow用户

发布于 2010-04-09 17:33:54

如果其他方法都失败了,您可以随时编写自己的自定义ID生成器,并在DAO的create(Entity entity)方法中使用它。ID序列表可能类似于

代码语言:javascript
复制
-------------------------------------------------------------
| sequence_name | initial_value | current_value | increment |
-------------------------------------------------------------
|           foo |          1001 |          2000 |       100 |

这可能意味着表foo的ID从1001开始,递增100 (因此您不必为每次新的表插入调用DB )。

这就是我们正在使用的,没有太多问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2606182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档