在Hibernate中,Generator类需要ID标记吗?

时间:2014-02-17 05:27:01

标签: java sql hibernate triggers

我是Hibernate的新手,问题是“Hibernate中是否需要ID类标记?”

在我的表中有下面提到的触发器,我的表是现有表并且有记录。我刚从Native SQL到Hibernate会话进行了代码更改。在这种情况下“生成器类是否需要Hibernate中的ID标签?”。这里我的例外是记录需要插入下一个序列值。

TRIGGER TRG_BI_APPLICATION_DATA_LOCK
   BEFORE INSERT
   ON APPLICATION_DATA_LOCK REFERENCING NEW AS NEW OLD AS OLD
   FOR EACH ROW
DECLARE
   exception_no_null_pk   EXCEPTION;
BEGIN
   IF :new.APP_DATA_LOCK_ID is null
   THEN
     SELECT SEQ_APPLICATION_DATA_LOCK_PK.nextval
        INTO :new.APP_DATA_LOCK_ID
        FROM dual;
   END IF;
END;

假设在插入调用触发器之前将创建下一个ID值并且将发生插入。那么,在hbm文件中,我们需要生成器类还是需要生成器必须使用的手段? 请帮助我......

...谢谢

1 个答案:

答案 0 :(得分:0)

我将推断你在问题标题中提出的问题,答案是否定的,你不需要@GeneratedValue注释来使你的ID工作,只要你想指定a)你的ID将是Hibernate未生成的值,b)如果要指定ID的生成方式。

我认为你需要做的是:

@Entity
@Table
public class Foo{
    @Id
    @GeneratedValue(generator = "applicationLockSequence")
    @SequenceGenerator(name = "applicationLockSequence" sequenceName = "SEQ_APPLICATION_DATA_LOCK_PK")
    private int id;
 ....
}

这基本上指定数据库上有一个具有该名称的序列,并且Hibernate应该使用该序列在保存时为您的对象分配ID。没有必要在具有触发器的数据库级别执行此操作,尽管这也是一种有效的方法。如果您想使用触发器执行此操作,请忽略@GeneratedValue@SequenceGenerator

希望能回答你的问题。

TL; DR OP正在使用.hbm文件进行休眠映射。 如下所示:How To Use Sequence In Hibernate As A Property In XML Mapping

<id name="id" column="item_id>
    <generator class="sequence">
        <param name="sequence">SEQ_APPLICATION_DATA_LOCK_PK</param>
    </generator>
</id>

应该是你需要做的所有事情。