配置Hibernate以使用Oracle的SYS_GUID()作为主键
我正在寻找一种SYS_GUID()
在插入新行时使其hibernate以使用oracle
函数的方法。当前,我的数据库表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;
}
很好,但是我更希望向导是由数据库生成的,因此它们将是顺序的,并可能具有更好的性能。另外,我只想知道如何配置它。
我使用注解进行配置,但是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”生成器。请参阅Hibernate论坛中的这篇文章。看起来他们曾经使用过SYS_GUID()
一段时间增加了对Oracle的支持,但是文档仍然说它们仅支持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是什么。例如,请考虑以下情形:
- 您创建一个新的Product对象并保存。Oracle分配ID。
- 您从hibernate会话中分离产品。
- 您稍后重新连接它并进行一些更改。
- 现在,您要保留这些更改。
在不知道ID的情况下,Hibernate无法做到这一点。它需要ID才能发出UPDATE语句。因此,实施必须org.hibernate.id.GUIDGenerator
先生成ID,然后再在INSERT语句中重新使用它。
这就是为什么如果您使用数据库生成的ID(包括在支持它的数据库上自动递增),则Hibernate无法进行 任何批处理的
原因相同。当一次插入很多对象时,使用一种hilo生成器或其他一些Hibernate生成的ID机制是获得良好性能的唯一方法。
以上是 配置Hibernate以使用Oracle的SYS_GUID()作为主键 的全部内容, 来源链接: utcz.com/qa/413523.html