2011-06-22 41 views
0

我有一個Student對象,我需要將它保存在數據庫中。的ID:studentId在HBM定義如下: -在休眠狀態下設置生成的ID時出現錯誤

 <id name="studentId" type="long"> 
      <column name="ST_ID" /> 
      <generator class="native" /> 
     </id> 

現在,用於生成ID,我已編寫的代碼,這是我一般實現,同樣,因爲它是存在於休眠源,如下: -

// 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) 

請幫助,因爲我無法理解的錯誤,因爲我甲肝e從hibernate中選擇了相同的代碼。如果它能正常工作,那麼這個代碼也應該在這裏工作。

感謝

回答

0

該錯誤造成,因爲Student類沒有方法setStudentId{Long id)

+0

'學生類有方​​法'setStudent(Long id)'.. –

+0

它應該有setStudentId {Long id)和一個名爲studentId的字段。你應該遵循java bean的約定。 –

+0

正如我之前提到的,學生類包含屬性'studentId'和'setStudentId(Long id)'方法' –

1

有些發電機不能產生實際插入前的標識,所以他們從generate()返回一個特殊的標記對象方法。該對象表示Hibernate應該以不同的方式獲取標識符,使用PostInsertIdentifierGenerator.getInsertGeneratedIdentifierDelegate()方法。

+0

正確,當我執行該行時生成Id,同時調試時我發現該值爲' POST_INSERT_INDICATOR'和id引用'IdentifierGeneratorFactory $ 2'的一個實例 –

0

在HBM文件中,我提到發生器爲<generator class="native" />,它沒有工作,然後我試着用<generator class="increment"/>,我不知道確切的原因,但它適用於此。

我覺得正確的原因可能是標識符生成器是POST_INSERT_INDICATOR,我覺得這意味着該id將在對象被插入到數據庫中後生成,而我試圖在insetion生成之前生成該對象,它失敗的原因。

我甚至與其它ID發電機也試過,Refer This,我試圖uuidassignedincrementsequencehilo,他們都工作正常,但native & identity,失敗同樣的問題。

對此答案的任何更新都會被邀請,因爲即使我想知道此事的確切原因,並且想知道確切原因。