【发布时间】:2010-05-01 12:37:55
【问题描述】:
首先,我们使用 JPA 2.0 和 Hibernate 3.5 作为 PostgreSQL 数据库上的持久性提供程序。
我们通过 JPA 2.0 注释成功地将数据库序列用作单字段代理键的自动生成值,并且一切正常。
现在我们正在实现一个双时态数据库方案,该方案需要以下方式的混合键:
Table 1:
id (pk, integer, auto-generated-sequence)
validTimeBegin (pk, dateTime)
validTimeEnd (dateTime)
firstName (varChar)
现在我们遇到了问题。你看,如果我们INSERT 一个新元素,id 字段是自动生成的,这很好。只是,如果我们想 UPDATE 这个方案中的字段,那么我们必须更改 validTimeBegin 列而不更改 id 字段并将其作为新行插入,如下所示:
在更新行之前:
|---|-------------------------|-------------------------|-------------------|
| id| validTimeBegin | validTimeEnd | firstName |
|---|-------------------------|-------------------------|-------------------|
| 1| 2010-05-01-10:00:00.000 | NULL | Gerald |
|---|-------------------------|-------------------------|-------------------|
在 2010-05-01-10:35:01.788 服务器时间发生的行更新之后:
(we update the person with the id:1 to reflect his new first name...)
|---|-------------------------|-------------------------|-------------------|
| id| validTimeBegin | validTimeEnd | firstName |
|---|-------------------------|-------------------------|-------------------|
| 1| 2010-05-01-10:00:00.000 | 2010-05-01-10:35:01.788 | Gerald |
|---|-------------------------|-------------------------|-------------------|
| 1| 2010-05-01-10:35:01.788 | NULL | Jerry |
|---|-------------------------|-------------------------|-------------------|
所以我们的问题是,对于字段id 使用自动生成的序列根本不起作用,因为在插入新行时,ID 总是自动生成的,尽管它确实是组合键有时应该表现不同。
所以我的问题是:
有没有办法通过 JPA 告诉休眠停止自动生成id-字段,以防我想生成同一个人的新品种并在其他情况下照常继续,或者我必须接管使用自定义代码生成整个 id?
提前致谢, 杰拉德
【问题讨论】:
标签: java jpa sequence composite-key surrogate-key