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)