【问题标题】:Cannot retrieve the id of the last inserted row in Oracle using Hibernate无法使用 Hibernate 在 Oracle 中检索最后插入行的 id
【发布时间】:2013-04-25 23:36:56
【问题描述】:

我正在使用在插入序列之前触发的触发器为 Oracle 11g xe 中的表生成 id

这是我的触发器

DROP TRIGGER GOOGLEPLAY.ORGANIZATION_CODE_GENERATOR;

CREATE OR REPLACE TRIGGER GOOGLEPLAY.ORGANIZATION_code_generator
BEFORE INSERT
ON GOOGLEPLAY.ORGANIZATIONS 
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE

BEGIN

        select ORGANIZATION_SEQ.nextval into :NEW.code from dual;

EXCEPTION
   WHEN OTHERS
   THEN
      -- Consider logging the error and then re-raise
      RAISE;
END ORGANIZATION_code_generator;

这是我的顺序

DROP SEQUENCE GOOGLEPLAY.ORGANIZATION_SEQ;

CREATE SEQUENCE GOOGLEPLAY.ORGANIZATION_SEQ
  START WITH 41
  MAXVALUE 99
  MINVALUE 1
  NOCYCLE
  NOCACHE
  NOORDER;

我想通过我正在使用的休眠获取这个 id

  session.persist(cashierOrganization);
  session.flush();
  cashierOrganization = (Organizations) session.merge(cashierOrganization);

但我总是得到 0 的 id 有什么建议吗?

【问题讨论】:

  • 顺便说一句:REFERENCING NEW AS New OLD AS Old 没用,您可以删除它。您不需要触发器中的 declare 块。如果您在 11g 中,select ORGANIZATION_SEQ.nextval into :NEW.code from dual; 可以重写为:new.code := organization_seq.nextval;,我怀疑最大值 99 可能会在以后给您带来问题:-)。
  • 感谢 Ben 对我有帮助,再次感谢。

标签: java hibernate oracle11g


【解决方案1】:

您是否尝试使用自定义生成器在插入期间获取触发器设置的 Id?当您使用 Oracle 时,这是一种相对常见的情况。尝试使用这个:

@Id
@GeneratedValue(generator="triggerGenerator")
@GenericGenerator(name="triggerGenerator", 
    strategy="package.to.my.custom.generator.TriggerAssignedIdentityGenerator")
private Long id;

TriggerAssignedIdentityGenerator 是一个实现自定义生成器策略的类,它的实现显示在 Hibernate 论坛的这个主题中:

希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 2012-10-29
    • 2012-10-29
    • 2014-08-08
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    相关资源
    最近更新 更多