Java 生成器类在Hibernate中是否需要ID标记?
我不熟悉Hibernate,问题是“生成器类是否需要Hibernate中的ID标记?” 在我的表中有下面提到的触发器,我的表是现有的表,并且有记录。我只是将代码从本机SQL更改为Hibernate会话。在这种情况下,“生成器类是否需要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
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>