如何为预加载引导数据保留一组主键标识符

时间:2010-04-09 09:10:15

标签: database hibernate jpa hbm2ddl

我们希望为所有表(例如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工具。

如果这是正确的方法,请告诉我

2 个答案:

答案 0 :(得分:1)

您可以尝试TABLE策略而不是IDENTITY。来自Hibernate的书:

  

很像Hibernate的hilo策略,TABLE   依赖于保存最后生成的数据库表   整数主键值,以及每个   生成器映射到此表中的一行。   每行有两列:pkColumnName   和valueColumnNamepkColumnValue将每一行分配给特定的生成器,   并且值列保留最后一个   检索到的主键。持久性提供者   最多分配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)。

这就是我们在没有太多问题的情况下使用的。