java - JPA 2.0、PostgreSQL 和 Hibernate 3.5 中的混合代理复合键插入

标签 java jpa sequence composite-key surrogate-key

首先,我们使用 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 告诉 hibernate 停止自动生成 id 字段,以防我想生成同一个人的新变种,并在其他情况下照常继续或做我必须用自定义代码接管整个 ID 生成吗?

提前致谢, 杰拉德

最佳答案

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

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

关于java - JPA 2.0、PostgreSQL 和 Hibernate 3.5 中的混合代理复合键插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2749923/

相关文章:

python - 确定一个序列是否在另一个序列中的最佳方法?

java - Java 中 MD5 的哈希值?

java - ognl.OgnlException : source is null for getProperty(null, "0")错误

spring - JPA,外部化列、表或模式名称?

java - 如何在多对多关联表上编写查询

python - tensorflow 预测序列

Python - 是五边形数检查

java - Controller 与 url 不匹配

java - 为TextView中的文本添加不同的监听器

java - JPA 无法以多对一关系持久保存实体