在hibernate中设置生成的id时获取错误

时间:2011-06-22 07:48:27

标签: java hibernate id-generation

我有一个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中选择了相同的代码。如果它工作正常,那么这个代码也应该在这里工作。

由于

3 个答案:

答案 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,我尝试了uuidassignedincrementsequencehilo ,他们已经正常工作,但native&amp; identity,遇到了同样的问题。

邀请对此答案进行任何更新,因为即使我想知道这件事的确切原因,并且想知道,确切的原因。