我们想保留一组主密钥标识符的所有表(例如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递增(所以你不用调用数据库为每个新表插入做)。

这就是我们使用的是什么,没有什么问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top