首先,我们使用 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
-field 并将其作为新行插入,如下所示:
在更新行之前:
|---|-------------------------|-------------------------|-------------------|
| 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
-field,以防我想生成同一个人的新变种,并在其他情况下照常继续,或者我必须用自定义代码接管整个 id 生成?
在此先感谢,杰拉德