我们希望为所有表(例如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的逆向工程DDL工具。
如果这是正确的方法,请告诉我
答案 0 :(得分:1)
您可以尝试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"/>
这声明了一个名为
MY_SEQUENCE
的数据库序列,其初始值为 123可以用作数据库标识符生成的源,以及持久性 每次需要标识符时,引擎应该获得20个值。 (注意, 但是,在撰写本文时,Hibernate Annotations忽略了initialValue
设置。)要将此标识符生成器应用于特定实体,请使用其名称:
@Entity
class name MyEntity {
@Id @GeneratedValue(generator = "mySequenceGenerator")
String id;
}
答案 1 :(得分:1)
如果其他一切都失败了,您可以随时编写自己的自定义ID生成器,并在DAO的create(Entity entity)
方法中使用它。 ID序列表可能类似于
-------------------------------------------------------------
| sequence_name | initial_value | current_value | increment |
-------------------------------------------------------------
| foo | 1001 | 2000 | 100 |
这可能意味着表foo
的ID从1001开始并递增100(因此您不必为每个新表插入调用DB)。
这就是我们在没有太多问题的情况下使用的。