Java 在hibernate中设置生成的id时出错

Java 在hibernate中设置生成的id时出错,java,hibernate,id-generation,Java,Hibernate,Id Generation,我有一个Student对象,需要保存在数据库中。id:studentId的定义与HBM中的定义类似:- <id name="studentId" type="long"> <column name="ST_ID" /> <generator class="native" /> </id> 现在,当我到达代码行persister.setIdentifier(entity

我有一个
Student
对象,需要保存在数据库中。id:
studentId
的定义与HBM中的定义类似:-

        <id name="studentId" type="long">
            <column name="ST_ID" />
            <generator class="native" />
        </id>
现在,当我到达代码行
persister.setIdentifier(entity,id,EntityMode.POJO)时,我得到以下异常:-

IllegalArgumentException in class:
com.school.class.Student, setter method of property: studentId
org.hibernate.property.BasicPropertyAccessor$BasicSetter set
SEVERE: expected type: long, actual value: org.hibernate.id.IdentifierGeneratorFactory$2
org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of com.school.class.Student.studentId
    at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:104)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.setIdentifier(AbstractEntityTuplizer.java:211)
    at org.hibernate.persister.entity.AbstractEntityPersister.setIdentifier(AbstractEntityPersister.java:3601)
    at com.school.class.Student.<init>(Student.java:140)
类中的IllegalArgumentException: com.school.class.Student,属性设置方法:studentId org.hibernate.property.BasicPropertyAccessor$BasicSetter 严重:预期类型:长,实际值:org.hibernate.id.IdentifierGeneratorFactory$2 org.hibernate.PropertyAccessException:调用com.school.class.Student.studentId的setter时发生IllegalArgumentException 位于org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:104) 位于org.hibernate.tuple.entity.AbstractEntityTuplizer.setIdentifier(AbstractEntityTuplizer.java:211) 位于org.hibernate.persister.entity.AbstractEntityPersister.setIdentifier(AbstractEntityPersister.java:3601) 在com.school.class.Student.(Student.java:140)
请帮助,因为我无法理解错误,因为我从hibernate中选择了相同的代码。如果它在那里正常工作,那么这个代码也应该在这里工作


感谢

导致该错误的原因是
学生
类没有方法
setStudentId{Long id)
一些生成器无法在实际插入之前生成标识符,因此它们从
生成()返回一个特殊的标记对象
方法。此对象表示Hibernate应使用不同的方法以不同的方式获取标识符。

在HBM文件中,我提到生成器为
,但它不起作用,然后我尝试了
,我不知道确切原因,但它可以正常工作

我觉得正确的原因可能是标识符生成器是
POST\u INSERT\u INDICATOR
,这意味着在将对象插入数据库之后将生成id,而我在插入之前尝试生成id,这就是它失败的原因

我甚至还尝试了其他id生成器,我尝试了
uuid
分配
增量
序列
,和
hilo
,它们工作正常,但
本机
标识
,都因同样的问题而失败


欢迎对此答案进行任何更新,因为我想知道这件事的确切原因,也希望知道确切原因。

应该有setStudentId{Long id)和一个名为studentId的字段。您应该遵循JavaBean约定。正如我前面提到的,student类包含属性
studentId
和方法
setStudentId(Long id)
正确,当我执行该行生成Id时,在调试时我发现值为
POST\u INSERT\u INDICATOR
,Id引用了
IdentifierGeneratorFactory$2的实例
IllegalArgumentException in class:
com.school.class.Student, setter method of property: studentId
org.hibernate.property.BasicPropertyAccessor$BasicSetter set
SEVERE: expected type: long, actual value: org.hibernate.id.IdentifierGeneratorFactory$2
org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of com.school.class.Student.studentId
    at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:104)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.setIdentifier(AbstractEntityTuplizer.java:211)
    at org.hibernate.persister.entity.AbstractEntityPersister.setIdentifier(AbstractEntityPersister.java:3601)
    at com.school.class.Student.<init>(Student.java:140)