2011-01-13 83 views
0

我試圖使用Hibernate映射與基礎DB不可改變的財產,這裏是相同映射不可改變性冬眠

<hibernate-mapping default-access="field">  
<!-- Immutable property --> 
      <property name="creationDate" column="CREATIONDATE" type="timestamp" 
       update="false" not-null="true" /> 

映射文件的快照我還沒有宣佈在名稱中creationDate任何財產我類和Hibernate抱怨我用下面的錯誤

org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer] 
    at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:110) 
    at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:135) 
    at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:80) 
    at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:323) 
    at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:456) 
    at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:131) 
    at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84) 
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:267) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1341) 
    at com.raisonne.tr.persistence.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java:161) 
    at com.raisonne.tr.persistence.HibernateSessionFactory.<clinit>(HibernateSessionFactory.java:72) 
    at com.raisonne.tr.dao.impl.GenericDAOImpl.makePersistance(GenericDAOImpl.java:173) 
    at com.raisonne.tr.service.impex.impl.DestinationImportServiceImpl.startDestinationImport(DestinationImportServiceImpl.java:130) 
    at com.raisonne.tr.backoffice.actions.impex.DestinationImportAction.destinationImport(DestinationImportAction.java:118) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 

Caused by: org.hibernate.PropertyNotFoundException: field [creationDate] not found on com.tr.category.Category 
    at org.hibernate.property.DirectPropertyAccessor.getField(DirectPropertyAccessor.java:145) 
    at org.hibernate.property.DirectPropertyAccessor.getField(DirectPropertyAccessor.java:137) 
    at org.hibernate.property.DirectPropertyAccessor.getGetter(DirectPropertyAccessor.java:160) 
    at org.hibernate.mapping.Property.getGetter(Property.java:294) 
    at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEntityTuplizer.java:300) 
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:141) 
    at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:78) 

我是繼Hibernate的應用程序,我甚至無法看到在尊重類的名稱creationdate在caveatemptor(尤其是creatiodate)任何財產。

我只是想着如何最好的使用hiberntae來映射這些屬性。

在此先感謝

+0

我不明白。你的數據庫中有creationDate,但是你的Java中沒有它? – jpkrohling 2011-01-13 16:26:40

+0

@partenon是的,我想要的是,當一個實體堅持到桌子時它應該有信息,當它被創建時,並且我沒有看到任何理由在我的java實體類中聲明proprty。 – 2011-01-13 16:37:57

回答

1

基於從問題的意見:我想說的是,你應該在你的Java類中的private Date createdDate = new Date(),沒有一個二傳手(只有一個getter)。這樣,你(和Hibernate)仍然可以訪問它,但是這個實體的消費者不允許改變這個值。但是如果你真的不想在你的Java類中使用它,那麼你只需要從你的映射中移除它(並使用你的數據庫特性來填充這個字段,就像觸發器一樣)。這個錯誤是因爲您映射了數據庫列,但Java類中沒有這樣的屬性。只是從你的映射中刪除它應該抑制異常。