oracle - Hibernate + oracle 序列 + 触发器

标签 oracle hibernate jpa persistence sequence

我有一个由使用序列的触发器自动填充索引的表(Oracle 数据库)

CREATE TABLE A
(
  IDS                           NUMBER(10)      NOT NULL
)


CREATE OR REPLACE TRIGGER A_TRG
BEFORE INSERT
ON A REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
BEGIN
  :new.IDS := A_SEQ.nextval;
END A_TRG;
/

我有一个匹配的 Java 类:
Class A {
   @Id
   @SequenceGenerator(name = "aSequence", sequenceName = "A_SEQ", allocationSize = 1)
   @GeneratedValue(generator = "aSequence", strategy = GenerationType.SEQUENCE)
   @Column(name = "IDS")
   Long id;

   ...
}

当我尝试像这样持久化 A 的实例时:
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
A a = new A();
Long id = getHibernateTemplate().save(a);
transaction.commit();

我得到这个问题:
  • 保存调用返回的代码中的 ID = “X”
  • 数据库中的 ID = “X+1”

  • 有没有办法设置 Hibernate 让数据库触发器创建 ID?

    谢谢

    最佳答案

    回复发现于 HIbernate issue with Oracle Trigger for generating id from a sequence

    我需要调整我的触发器以仅在没有给出 ID 的情况下运行:

    CREATE OR REPLACE TRIGGER A_TRG
    BEFORE INSERT
    ON A REFERENCING NEW AS New OLD AS Old
    FOR EACH ROW
    WHEN (New.IDS is null) -- (1)
    BEGIN
      :new.IDS := A_SEQ.nextval;
    END A_TRG;
    /
    

    (1) 这一行允许 Hibernate 手动调用 A_SEQ.nextVal 来设置 ID,然后绕过触发器,否则 Hibernate 将无用地获取 nextval,因为触发器总是会再次调用 nextval 重置 ID

    关于oracle - Hibernate + oracle 序列 + 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13418163/

    相关文章:

    sql - 将列中的数值分别替换为列中其他值的排名

    regex - PL/SQL 正则表达式匹配不在引号内的逗号

    java - 处理过时的域对象(Grails/GORM/Hibernate)引起的并发问题的策略

    hibernate - 避免 Grails/Hibernate 中的 N+1 选择

    Spring Data Rest @EmbeddedId 无法从 Post Request 构造

    sql - 如何避免SQL Developer中的 "raw variable length too long"错误?

    Mysql 与 Oracle XE 与 Postgresql。可扩展性和性能,该选择哪一个?

    hibernate - GROUP_CONCAT Hibernate HQL

    java - 实体中的日期计算

    java - 事务管理器和实体管理器有什么区别