【问题标题】:hibernate and oracle sequence GenericGenerator creates gaphibernate 和 oracle 序列 GenericGenerator 创建间隙
【发布时间】:2012-07-26 08:39:05
【问题描述】:

我已将我的班级映射如下(省略了其他字段,因为只有 ID 很重要):

@Entity
@Table(name = "MODEL_GROUP")
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class SettlementModelGroup implements Serializable
{


@Id
@GeneratedValue(generator = "MODEL_GROUP_SEQ", strategy = GenerationType.SEQUENCE)
@GenericGenerator(name = "MODEL_GROUP_SEQ",
        strategy = "sequence",
        parameters = @Parameter(name = "sequence", value = "SEQ_MODEL_GROUP_MODEL_GROUP_ID"))
@Column(name = "MODEL_GROUP_ID", nullable = false)
private Integer modelId;
}

当我保存新对象时:

Integer modelGroupId = sessionFactory.getCurrentSession().save( modelGroup );
System.out.println( modelGroupId );

ID 设置为例如23,但当我查看数据库时,它实际上是24。这会导致很多问题,因为我稍后会使用此 ID。知道为什么会出现这种差距吗?

SQL 日志显示一切正常(我是这么认为的):

Hibernate: 
 select
     SEQ_MODEL_GROUP_MODEL_GROUP_ID.nextval 
 from
     dual
Hibernate: 
 insert 
 into
     MODEL_GROUP
     (DOMAIN_ID, DESCRIPTION, NAME, PERIOD_TYPE_ID, MODEL_GROUP_TYPE_ID, STATUS_ID, OWNER_ID, MODEL_GROUP_ID) 
 values
     (?, ?, ?, ?, ?, ?, ?, ?)

触发器和序列:

CREATE SEQUENCE "SEQ_MODEL_GROUP_MODEL_GROUP_ID" 
  INCREMENT BY 1 
  START WITH 1 
  NOMAXVALUE 
  MINVALUE 1 
 NOCYCLE 
 NOCACHE 
 NOORDER
;

CREATE OR REPLACE TRIGGER "TRG_MODEL_GROUP_MODEL_GROUP_ID" 
BEFORE INSERT 
ON "MODEL_GROUP" 
FOR EACH ROW 
WHEN (NEW."MODEL_GROUP_ID" is NULL)
BEGIN 
    SELECT "SEQ_MODEL_GROUP_MODEL_GROUP_ID".NEXTVAL 
    INTO :NEW."MODEL_GROUP_ID" 
    FROM DUAL; 
END;

【问题讨论】:

  • 我对hibernate一无所知,但是,如果你用谷歌搜索“hibernate如何处理oracle序列”,我想你会找到你问题的答案。
  • 谢谢,你的线索帮助我摆脱了这个错误!

标签: java oracle hibernate spring-mvc oracle11g


【解决方案1】:

显然,当 Hibernate 向数据库询问 ID 的 nextValue 时,它​​也会触发 Trigger。因此,当我询问 ID 时,我得到了编号 23,但是当通过提交事务实际保存到数据库时,它又增加了,所以我得到了 24。解决方案在这里描述:

HIbernate issue with Oracle Trigger for generating id from a sequence

为了让它正常工作,我更改了触发器:

CREATE OR REPLACE TRIGGER "TRG_MODEL_GROUP_MODEL_GROUP_ID" 
BEFORE INSERT 
ON "MODEL_GROUP" 
FOR EACH ROW 
WHEN (NEW."MODEL_GROUP_ID" is NULL)
BEGIN 
    SELECT "SEQ_MODEL_GROUP_MODEL_GROUP_ID".NEXTVAL 
    INTO :NEW."MODEL_GROUP_ID" 
    FROM DUAL; 
END;

【讨论】:

    猜你喜欢
    • 2011-07-17
    • 2013-11-04
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2013-08-14
    相关资源
    最近更新 更多