1

我在现有数据库上设置了 ORM 并与 Oracle 一起工作,并且在我访问序列时能够使插入工作,但是由于在原始应用程序中使用了触发器,因此序列跳过了一个数字。

有没有办法让 ORM 使用触发器?

禁用触发器不是一个选项,因为它由现有应用程序使用,并且在迁移期间无法禁用。

component persistent="true" table="table_name"  schema="schema_name" { 
   property name="table_id" column="table_id" fieldtype="id" generator="sequence" sequence="schema_name.sequence_name";
...
}
4

2 回答 2

3

触发器是不可访问的程序单元。“调用”触发器的唯一方法是针对所属表执行适当的 DML。

您的问题有两种可能的解决方案。

  1. 重写触发器。您说另一个应用程序仍然需要触发器来填充 ID,但是您可以使用条件更改触发器的逻辑....

    if :new.id is null  then
         :new.id := whatever_seq.nextval;  --11g syntax for brevity
    end if;
    

    这将在其他应用程序插入表时填充 ID,但不会覆盖您的值。

  2. 别担心了。序列只是唯一标识符的生成器。数字上升,但如果有差距真的没关系。除非您要处理数十亿行,否则您的序列极不可能在您的应用程序退役之前用完数字。
于 2012-11-08T07:49:45.200 回答
0

您的意思是数据库通常使用插入触发器分配一个 ID?这可以解释为什么你要跳过一个数字。您可以尝试 generator="select" ,它会在插入发生(并且触发器已被触发)后休眠以读取 ID。它可以准确地处理我认为您所描述的情况。

于 2012-11-08T09:36:13.873 回答