Bonjour
Alors voilà j'ai un problème très bizarre en utilisant le tag 'timestamp'.
J'ai une classe qui représente le noeud d'un arbre. Au niveau hibernate, je n'ai qu'une relation many-to-one qui boucle donc sur la même entité. Quand je sauve, un noeud, je ne veux pas sauver le noeud parent.
J'utilise Hibernate 3.1 et le mapping est le suivant :
Code:
<class name="MyClazz" entity-name="MyEntityName" table="MY_TABLE" lazy="true">
<id name="code" column="CODE"/>
<timestamp name="publishedDate" column="PUBLISH_DATE"/>
<many-to-one name="parent" column="PARENT_CODE" not-null="false" lazy="proxy" entity-name="MyEntityName"/>
</class>
Suite à des contraintes d'ordre fonctionnelles, je dois pouvoir persister en base un noeud avant son parent... du coup PARENT_CODE n'est pas une clef étrangère.
Code:
MyClazz node = new MyClazz("code");
MyClazz parent = new MyClazz("parentCode");
node.setParent(parent);
session.saveOrUpdate("MyEntityName", node);
Au moment du commit j'obtiens l'exception suivante :
Code:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.cbe.rbm.fare.DBFareElementDescription
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:216)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:108)
at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:221)
at org.hibernate.type.TypeFactory.findDirty(TypeFactory.java:476)
at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:2803)
at org.hibernate.event.def.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:467)
at org.hibernate.event.def.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:190)
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:113)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:195)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:353)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
...
A noter que tout se passe très bien si je n'utilise pas le tag timestamp.
Voilà merci pour votre aide
Alex