2011-01-13 19 views
0

Ich versuche, eine unveränderliche Eigenschaft mit zugrunde liegenden DB mit Hibernate abzubilden und hier ist die Zuordnungsdatei Snapshot für die gleicheMapping unveränderliche Eigenschaften Hibernate

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

i jede Eigenschaft nicht in mit dem Namen creation erklärt haben meine Klasse und Hibernate ist mich mit dem folgenden Fehler beschweren

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) 

i wurde nach Hibernate CaveatEmptor Anwendung i auch nicht in der Lage jede Eigenschaft mit dem Namen creation in der angesehenen Klasse in CaveatEmptor zu sehen (vor allem für creatiodate).

Ich denke nur, wie wir solche Eigenschaften am besten mit Hiberntae abbilden können.

Vielen Dank im Voraus

+0

Ich verstehe es nicht. Sie haben creationDate in Ihrer Datenbank, aber Sie haben es nicht in Ihrem Java? – jpkrohling

+0

@Partenon ja, was ich will ist, dass, wenn immer eine Entität in der Tabelle persistieren wird, sollte es Informationen haben, wenn es erstellt wurde, und dafür sehe ich keinen Grund, in meiner Java-Entity-Klasse proprty zu deklarieren. –

Antwort

1

Basierend auf den Kommentaren von der Frage: Ich würde sagen, dass Sie eine private Date createdDate = new Date() in Ihrer Java-Klasse haben sollte, ohne Setter (nur ein Getter). Auf diese Weise haben Sie (und den Ruhezustand) weiterhin Zugriff darauf, aber die Benutzer dieser Entität dürfen diesen Wert nicht ändern.

Aber wenn Sie es wirklich nicht in Ihrer Java-Klasse wollen, dann müssen Sie es nur aus Ihrem Mapping entfernen (und verwenden Sie Ihre Datenbankfunktionen, um dieses Feld wie Trigger zu füllen). Dieser Fehler tritt auf, weil Sie die Datenbankspalte zugeordnet haben, in der Java-Klasse jedoch keine solche Eigenschaft. Wenn Sie es nur aus Ihrem Mapping entfernen, sollte die Ausnahme unterdrückt werden.

+0

stimme zu Ich experimentiere etwas wie diese. Danke für den Zeiger –