我们希望为所有表保留一组主键标识符(例如1-1000),以便我们可以使用预加载的系统数据引导系统。
我们所有的JPA实体类都有以下主键定义。
@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的逆向工程工具驱动的解决方案。
让我知道这是不是正确的方法
发布于 2010-04-09 17:30:20
您可以尝试使用TABLE策略,而不是IDENTITY。出自Hibernate一书:
与Hibernate的
hilo策略非常相似,TABLE依赖于一个数据库表,该表保存最后生成的整数主键值,每个生成器映射到该表中的一行。每行有两列:pkColumnName和valueColumnName。pkColumnValue将每一行分配给一个特定的生成器,值列保存最后检索到的主键。持久性提供程序在每个循环中最多分配allocationSize整数。
这里是an example,有更多解释。和一个更复杂的example for setting the initial value。
您还可以尝试使用在orm.xml中定义的自定义序列生成器,如下所示:
<sequence-generator name="mySequenceGenerator"
sequence-name="MY_SEQUENCE"
initial-value="123"
allocation-size="20"/>声明可以使用初始值为123的名为
MY_SEQUENCE的数据库序列作为数据库标识符生成的源,并且持久化引擎每次需要标识符时都应获取20个值。(不过请注意,Hibernate注释在编写时会忽略initialValue设置。)
要将此标识符生成器应用于特定实体,请使用其名称:
@Entity
class name MyEntity {
@Id @GeneratedValue(generator = "mySequenceGenerator")
String id;
}发布于 2010-04-09 17:33:54
如果其他方法都失败了,您可以随时编写自己的自定义ID生成器,并在DAO的create(Entity entity)方法中使用它。ID序列表可能类似于
-------------------------------------------------------------
| sequence_name | initial_value | current_value | increment |
-------------------------------------------------------------
| foo | 1001 | 2000 | 100 |这可能意味着表foo的ID从1001开始,递增100 (因此您不必为每次新的表插入调用DB )。
这就是我们正在使用的,没有太多问题。
https://stackoverflow.com/questions/2606182
复制相似问题