1

我们希望为所有表保留一组主键标识符(例如 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 工具驱动的解决方案。

让我知道这是否是正确的方法

4

2 回答 2

1

您可以尝试该TABLE策略而不是IDENTITY. 从休眠书中:

很像 Hibernate 的hilo策略,TABLE 依赖于保存最后生成的整数主键值的数据库表,并且每个生成器都映射到该表中的一行。每行有两列:pkColumnNamevalueColumnName。将pkColumnValue每一行分配给特定的生成器,值列保存最后检索到的主键。持久性提供程序在每一轮中最多分配allocationSize整数。

这是一个有更多解释的例子。还有一个更复杂的设置初始值的例子

您还可以尝试使用在您的 中定义的自定义序列生成器,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;
}
于 2010-04-09T09:30:20.373 回答
1

如果一切都失败了,你总是可以编写自己的自定义 ID 生成器,并在你的 DAOcreate(Entity entity)方法中使用它。ID 序列表可能类似于

-------------------------------------------------------------
| sequence_name | initial_value | current_value | increment |
-------------------------------------------------------------
|           foo |          1001 |          2000 |       100 |

这可能意味着表的 IDfoo从 1001 开始并递增 100(因此您不必为每个新表插入调用 DB)。

这就是我们正在使用的,没有太多问题。

于 2010-04-09T09:33:54.003 回答