我有一个Student
对象需要保存在数据库中。 id:studentId
的定义与HBM类似: -
<id name="studentId" type="long">
<column name="ST_ID" />
<generator class="native" />
</id>
现在,为了生成ID,我编写了代码,我已经实现了,与hibernate Source中的代码相同,如下所示: -
// fetching the entity persister for the entity
EntityPersister persister =
((SessionImpl)session.).getEntityPersister(entity.getClass().getName(), entity);
// get the model
PersistentClass model = configuration.getClassMapping(persister.getEntityName());
// cache concurrency
CacheConcurrencyStrategy strategy = persister.getCache();
Class persiterClass = model.getEntityPersisterClass();
SessionFactoryImpl sessionFactoryImpl =
(SessionFactoryImpl) session.getSessionFactory();
if(persiterClass == null) {
persister = new SingleTableEntityPersister(model, strategy, sessionFactoryImpl)
}
this.id = persister.getIdentifierGenerator().generate((SessionImpl)session, entity);
persister.setIdentifier(entity, id, EntityMode.POJO);
现在,当我到达代码行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)
请帮助,因为我无法理解错误,因为我从hibernate中选择了相同的代码。如果它工作正常,那么这个代码也应该在这里工作。
由于
答案 0 :(得分:1)
某些生成器无法在实际插入之前生成标识符,因此它们会从generate()
方法返回特殊标记对象。该对象表明Hibernate应该使用PostInsertIdentifierGenerator.getInsertGeneratedIdentifierDelegate()
方法以不同的方式获取标识符。
答案 1 :(得分:0)
导致该错误的原因是Student
类没有方法setStudentId{Long id)
答案 2 :(得分:0)
在HBM文件中,我提到生成器为<generator class="native" />
,但是它无法正常工作,然后我尝试使用<generator class="increment"/>
,我不知道具体原因,但它与这一点。
我觉得正确的理由可能是标识符生成器是POST_INSERT_INDICATOR
,我觉得这意味着在将对象插入数据库之后将生成id,而我之前尝试生成相同的ID保密,这就是它失败的原因。
我甚至尝试了其他ID生成器,Refer This,我尝试了uuid
,assigned
,increment
,sequence
和hilo
,他们已经正常工作,但native
&amp; identity
,遇到了同样的问题。
邀请对此答案进行任何更新,因为即使我想知道这件事的确切原因,并且想知道,确切的原因。