【问题标题】:Hibernate + oracle sequence + triggerHibernate + oracle 序列 + 触发器
【发布时间】:2012-11-05 06:30:39
【问题描述】:

我有一个表,其索引由使用序列的触发器自动填充(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?

谢谢

【问题讨论】:

    标签: oracle hibernate jpa persistence sequence


    【解决方案1】:

    在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,因为触发器总是会重置 ID 再次调用 nextval

    【讨论】:

      【解决方案2】:

      在您的 B 类中,您有 @GeneratedValue(generator = "preferenceSequence"),在您的示例中未定义,它应该是 @GeneratedValue(generator = "bSequence")

      默认情况下,休眠分配大小为 50,B:IDS=50 似乎表明映射选择了错误的序列。

      【讨论】:

      • 感谢您的回答。我刚刚更改了preferenceSequence -> bSequence(复制粘贴错误)。分配大小强制为1,A的ID和B的ID没有关联,给定的值不是真实的,只是举例。重要的值是不等于的 A.IDS 和 B.A_IDS:-/ 问候
      • 您的问题解决了吗?如果是这样,请将我的回复标记为答案
      • 我的问题没有解决,persist 调用会生成一个带有错误“A”ID 的“B”实例。如示例中所述,我发现 A.ids=10 但 B.a.ids=9。
      猜你喜欢
      • 2015-03-04
      • 1970-01-01
      • 2014-10-28
      • 2014-05-05
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 2013-11-04
      • 2011-05-11
      相关资源
      最近更新 更多