当前位置: 首页 > 面试题库 >

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

曾嘉瑞
2023-03-14
问题内容

我正在寻找一种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 (?, ?, ?, ?, ?, ?)

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


问题答案:

您也许可以使用“
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是什么。例如,请考虑以下情形:

  1. 您创建一个新的Product对象并保存。Oracle分配ID。
  2. 您从hibernate会话中分离产品。
  3. 您稍后重新连接它并进行一些更改。
  4. 现在,您要保留这些更改。

在不知道ID的情况下,Hibernate无法做到这一点。它需要ID才能发出UPDATE语句。因此,实施必须org.hibernate.id.GUIDGenerator先生成ID,然后再在INSERT语句中重新使用它。

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



 类似资料:
  • 我们的项目需要同时支持Oracle和Postgres DBS。并且可能会有更多的数据库添加到此列表中。因此需要为BLOB和CLOB数据类型提供一个与DB无关的Hibernate配置。 而Oracle正在与以下方面进行良好的合作: Postgres也开始抱怨。 研究发现,人们建议使用和进行注释。这两个都是Hibernate注释。但是,我们打算使用JPA注释,这需要在运行时使用Hibernate,在我

  • 1. 前言 使用 Hibernate 时,需要时时修改 Hibernate.cfg.xml 主配置文件中的信息, 这些信息至关重要,允许开发者按自己的需要订制使用 Hibernate 。 本节课程将从 2 个方面帮助大家更好的理解 Hibernate.cfg.xml 主配置文件: 主配置文件的核心作用; 主配置文件中的可配置项有哪些。 2. 配置文件的作用 先了解一下设计模式和设计原则: 设计模式

  • 这是域对象: 这是测试课程: 这是冬眠。cfg。xml: 这是sql语句(我使用oracle开发人员) 错误这就是错误: 错误:ORA-00923:无法从关键字中找到必需的 异常线程"main"org.hibernate.exception.SQLGrammarExc0019:无法提取结果集org.hibernate.exception.internal.SQLExceptionTypeDeleg

  • 我有以下问题,我有一个已经存在的表,有三个字段field1,field2,field3。Field1实际上是另一个表的外键(@OneToOne)。所有字段2和字段3都可以为空,所以我不能为所有三个字段设置主键。在数据库中,field1 field2 field3有一个唯一约束。 我用JPA/Hibernate尝试了几种解决方案,但没有找到一个好的。如果不定义@Id,JPA当然无法工作。在@Embe

  • 问题内容: 如何使Grails 3.1.1用户成为Hibernate 5? 以下操作报告了Hibernate版本4.3.11.Final:在Grails 3.1.1中 grails创建应用hello311 编辑BootStrap.groovy,如下所示 Grails运行应用 控制台显示:Hibernate版本为:4.3.11.Final 我的build.gradle未编辑。create-app命令

  • 问题内容: 我有一个用于存储优惠券/折扣的表,并且我想将coupon_code列用作主键,即。 我的理由是,每个优惠券都将具有唯一的代码,而我将要运行的唯一命令是 我不会进行任何联接或索引编制,并且我看不到该表中有超过几百个条目。 在我看来,这可以,但是我不知道是否有任何我想念的东西。 问题答案: 从某种意义上说,您当然可以,您的RDBMS将允许您这样做。这个问题的答案,你是否没有问题 应该 做到