gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:55:35 25 4
gpt4 key购买 nike

首先,我们使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com