gpt4 book ai didi

java - 配置 Hibernate 以使用 Oracle 的 SYS_GUID() 作为主键

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:24:22 26 4
gpt4 key购买 nike

我正在寻找一种方法让 hibernate 在插入新行时使用 oracle 的 SYS_GUID() 函数。目前我的数据库表有 SYS_GUID() 作为默认值,所以如果 hibernate 只是简单地生成省略了它应该工作的值的 SQL。

我一切正常,但它目前正在使用 system-uuid 生成器在代码中生成 UUID/GUID:

@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(name = "PRODUCT_ID", unique = true, nullable = false)
public String getId() {
return this.productId;
}

这很好,但我更希望 guid 由数据库生成,这样它们将是顺序的并且可能具有更好的性能。另外,我只想知道如何配置它。

我正在使用注释进行配置,但 xml 配置示例也很棒。

这是一个示例表定义(以防万一):

CREATE TABLE SCHEMA_NAME.PRODUCT
(
PRODUCT_ID RAW(16) DEFAULT SYS_GUID() NOT NULL,
PRODUCT_CODE VARCHAR2(10 CHAR) NOT NULL,
PRODUCT_NAME VARCHAR2(30 CHAR) NOT NULL,
PRODUCT_DESC VARCHAR2(512 CHAR)
)

更新:

Mat 使用“guid”的解决方案有效,这里是生成的 sql:

Hibernate: 
select rawtohex(sys_guid())
from dual
Hibernate:
insert into PRODUCT
(PRODUCT_CODE, PRODUCT_DESC, LOB_ID, PRODUCT_NAME, PROVIDER_ID, PRODUCT_ID)
values (?, ?, ?, ?, ?, ?)

在插入中使用列默认值似乎是不可能的,因此只能在应用程序生成的 guid 和数据库往返之间进行选择。

最佳答案

您也许可以使用“guid”生成器。参见 this post来自 Hibernate 论坛。看起来他们不久前使用 SYS_GUID() 添加了对 Oracle 的支持,但是 documentation仍然说他们只支持 SQL Server 和 MySQL。

我还没有使用过 JPA 注释,但这里有一个使用 XML 配置的示例:

<id name="PRODUCT_ID">
<generator class="guid" />
</id>

编辑:关于你的第二个问题,我想你是在问为什么 Hibernate 不能做这样的事情:

INSERT INTO PRODUCT (PRODUCT_ID, /* etc */)
SELECT SYSGUID(), /* etc */

原因是 Hibernate 必须知道对象的 ID 是什么。例如,考虑以下场景:

  1. 您创建一个新的 Product 对象并保存它。 Oracle 分配 ID。
  2. 您将 Product 从 Hibernate session 中分离出来。
  3. 您稍后重新附加它并进行一些更改。
  4. 您现在想要保留这些更改。

在不知道 ID 的情况下,Hibernate 无法执行此操作。它需要 ID 才能发出 UPDATE 语句。因此 org.hibernate.id.GUIDGenerator 的实现必须事先生成 ID,然后在 INSERT 语句中重新使用它。

如果您使用数据库生成的 ID(包括在支持它的数据库上自动递增),这就是为什么 Hibernate 不能执行任何批处理的相同原因。使用 hilo 生成器之一,或其他一些 Hibernate 生成的 ID 机制,是一次插入大量对象时获得良好性能的唯一方法。

关于java - 配置 Hibernate 以使用 Oracle 的 SYS_GUID() 作为主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/846786/

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