2

首先,我们使用 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 生成?

在此先感谢,杰拉德

4

2 回答 2

2

所以......现在已经过去了一段时间没有任何评论,现在我很确定没有办法做到这一点。事实上,这也是开发人员开始在应用程序端通过他们自己的 id-generators 为数据库生成他们自己的唯一密钥的原因之一。这样,数据库甚至都不知道代理键之类的东西;它只是接收它。

顺便说一句:我们通过实现我们自己的方法来更新这些行的任务解决了我们的问题。这些方法现在是 OR-Mapper 依赖的,并且绝不符合 JPA 2.0,但 JPA 只是不支持此类行为的注释。

于 2010-11-12T13:12:24.680 回答
0

AFAIK 你的 ID 字段不是 Hibernate 理解的 ID。如果我可以提出另一个解决方案,考虑到本质上您只想实现数据库修改日志记录:

  • 步骤 0:在 Hibernate 中只使用 ID 作为主键。在 Postgres 中使用复合主键。
  • 第 1 步:将过滤器添加到休眠,以自动过滤所有设置了 validEndTime 的行。
  • 第 2 步:将自定义更新语句添加到休眠状态,而不是插入。
  • 第 3 步:在 PostgreSQL 中添加自动设置结束时间的触发器。
  • 第 4 步:在 postgres 上创建一个约束索引,以便通过 hibernate 更快地查找。
于 2010-05-04T19:11:30.383 回答