我有一个由使用序列的触发器自动填充索引的表(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();
我得到这个问题:
有没有办法设置 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/