- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在寻找一种方法让 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 是什么。例如,考虑以下场景:
在不知道 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/
我有一个非常适合使用 GUID 作为键的 Oracle 项目。我找到了以下片段 SET SERVEROUTPUT ON BEGIN FOR indx IN 1 .. 5 LOOP DBMS_OUTPU
在oracle 10g 中,如何将SYS_GUID() 转换为varchar?我正在尝试类似的东西: select USER_GUID from user where email = 'user@ex
我在 oracle 中创建表,我想为主键添加自动增量 CREATE TABLE "TEST_1"."PERSON" ("ID" NUMBER NOT NULL ENABLE, "FNAM
我在将另一个表中的数据批量插入到新表中时遇到了一些问题。目标看起来有点像这样: CREATE TABLE TEST_T ( T_GUID RAW(16) DEFAULT SYS_GUID(
我需要有关 jooq DSL 的帮助。如何在 jooq DSL 中编写这样的插入: insert into t (c) values (sys_guid()); ?对于甲骨文。谢谢 最佳答案 每当您在
我有一些继承的代码,每次创建实体时都会调用 SELECT SYS_GUID() FROM DUAL。这意味着对于每次插入,都会对 Oracle 进行两次调用,一次获取 Guid ,另一次调用插入数据。
我想知道 Oracle 的 SYS_GUID() 函数是否返回 a RFC 4122 compliant UUID .例如: SQL> select sys_guid() from dual; SYS
我正在寻找一种方法让 hibernate 在插入新行时使用 oracle 的 SYS_GUID() 函数。目前我的数据库表有 SYS_GUID() 作为默认值,所以如果 hibernate 只是简单地
这里是有问题的 SQL 示例; SQL 应该在任何 Oracle DBMS 上运行(我正在运行 11.2.0.2.0)。 请注意结果集中的 UUID 值有何不同(一个有 898,另一个有 899),尽
我是一名优秀的程序员,十分优秀!