如何保留一组主键标识的预加载引导数据
题
我们想保留一组主密钥标识符的所有表(例如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和逆向工程工具DDL从休眠驱动的解决方案。
让我知道,如果这是正确的做法。
解决方案
您可以尝试TABLE
策略,而不是IDENTITY
。从Hibernate书:
就像Hibernate的
hilo
策略,TABLE
依靠保存生成的最后一个数据库表 整数主键值,并且每个 发电机被映射到一列在此表中。 每行有两列:pkColumnName
和valueColumnName
。所述pkColumnValue
每行分配到特定的发电机, 和值列保持最后 检索主键。持久性提供程序 分配高达allocationSize
整数 在每一圈。
您也可以尝试使用自定义序列发生器,在你orm.xml
定义是这样的:
<sequence-generator name="mySequenceGenerator"
sequence-name="MY_SEQUENCE"
initial-value="123"
allocation-size="20"/>
此声明数据库序列命名为初始值
MY_SEQUENCE
123可以被用作用于数据库标识符生成的源极,并且所述持久性 发动机应获得每次需要标识符时20个值。 (注意, 虽然,Hibernate注解,在写入时,将忽略initialValue
设置。)要应用此标识符发生器为特定的实体,使用它的名称:
@Entity
class name MyEntity {
@Id @GeneratedValue(generator = "mySequenceGenerator")
String id;
}
其他提示
如果一切都失败了,你总是可以编写自己的定制ID发生器和你的DAO的create(Entity entity)
方法使用它。的ID序列表可以是这样的
-------------------------------------------------------------
| sequence_name | initial_value | current_value | increment |
-------------------------------------------------------------
| foo | 1001 | 2000 | 100 |
这可能意味着表foo
启动的ID在1001和100递增(所以你不用调用数据库为每个新表插入做)。
这就是我们使用的是什么,没有什么问题。