Java 生成器类在Hibernate中是否需要ID标记?

Java 生成器类在Hibernate中是否需要ID标记?,java,sql,hibernate,triggers,Java,Sql,Hibernate,Triggers,我不熟悉Hibernate,问题是“生成器类是否需要Hibernate中的ID标记?” 在我的表中有下面提到的触发器,我的表是现有的表,并且有记录。我只是将代码从本机SQL更改为Hibernate会话。在这种情况下,“生成器类是否需要Hibernate中的ID标记?是否”。这里我的例外是记录需要插入下一个序列值 TRIGGER TRG_BI_APPLICATION_DATA_LOCK BEFORE INSERT ON APPLICATION_DATA_LOCK REFERENCING

我不熟悉Hibernate,问题是“生成器类是否需要Hibernate中的ID标记?”

在我的表中有下面提到的触发器,我的表是现有的表,并且有记录。我只是将代码从本机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;
假设在insert调用之前触发器将创建下一个ID值,并且insert将发生。所以,在hbm文件中,我们需要generator类,或者如果我们需要使用哪种生成器的方法? 请在这方面帮助我


谢谢…

我将从你的问题标题推断出你在问什么,答案是否定的,你的ID不需要@GeneratedValue注释就可以工作,只有当你想指定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文件进行hibernate映射。 如下文所述:


根据您的回答,我不需要在hbm文件中使用任何生成的类。写但是,没有提到会出现以下异常:org.hibernate.id.IdentifierGenerationException:在调用save()之前必须手动分配此类的id:ApplicationDataLockah,您是在使用hbm文件指定映射吗?我认为您不需要包含生成的ID,因为您的ID是由触发器在数据库级别生成的。它的有效含义是,如果您遇到需要获取对象ID的情况,您需要将其保存到数据库中,然后查询数据库以使您的对象充满ID。hibernate需要知道的是,您的对象有一个作为其ID的字段,如果您不告诉它,它不关心它是如何生成的。试试看,让我知道如果你想使用你的序列而不使用触发器,那么使用你的hbm文件链接中给出的以下配置。进一步阅读,这种方法比使用数据库触发器更可取。此方法允许hibernate在将id保存到数据库之前处理您的id生成,这是一个计算成本较低的选项,每次在表中输入新记录时运行该触发器。我参考了stackoverflow.com/questions/5082175/…使用如下,但得到12:21:15.916[main]DEBUG o.h.util.JDBCExceptionReporter-无法获取下一个序列值[从dual中选择SEQ_APPLICATION_DATA_LOCK_PK.nextval]java.sql.SQLException:ORA-02289:序列不存在
<id name="id" column="item_id>
    <generator class="sequence">
        <param name="sequence">SEQ_APPLICATION_DATA_LOCK_PK</param>
    </generator>
</id>