Ahoj,

to chovani je normalni. Pise se o tom na nekolika mistech v dokumentaci k Hibernatu.
 Metoda persist() je z JPA (jsou na EntityManageru).
 Metody saveOrUpdate() a save() jsou Hibernate specific a funguji jinak.

   Lukas


Petr Kolesa wrote:
Dobry den,

pri hrani si s JPA/Hibernate jsem narazil na chovani, ktery si nedokazu tak uplne vysvetlit. Jde o kaskadove ukladani objektu. Mam dva objekty

@Entity
public class Relation{
  @ManyToOne(cascade=CascadeType.ALL) // radek 3
   private Concept firstArg;
   // ...
}

@Entity
public class Concept {
   // ... nezajimavy obsah
}

Vytvorim instanci Relation, ktera obsahuje neulozenou instanci Concept.

*session.saveOrUpdate(relation)* funguje podle ocekavani. Stejne tak i *session.save()* a *session.persist()*

Ja ale potrebuju aby se koncept v relaci kaskadove ukladal, ale nemazal. Takze radek 3 by mel vypadat:
@ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})

*session.persits(relation)* funguje podle ocekavani, ale *session.save()* i *session.saveOrUpdate()* skonci s vyjimkou: TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: swingmuf.model.Concept

Pomuze, kdyz pridam na radek 3 hibernate-specific anotaci @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)

Je tohle normalni chovani?

Pouzivam Hibernate 3.2.3 GA

Diky
   kolisko


Kompletni trace stack:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: swingmuf.model.Concept at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:219)
   at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397)
   at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:242)
   at org.hibernate.type.TypeFactory.findDirty(TypeFactory.java:576)
at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:3121) at org.hibernate.event.def.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:472) at org.hibernate.event.def.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:197) at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:120) at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:196) 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:1000)
   at swingmuf.db.DAOHelper.save(DAOHelper.java:34)
   at swingmuf.db.DAOHelper.save(DAOHelper.java:45)
   at swingmuf.db.RitDAO.save(RitDAO.java:57)
   at swingmuf.db._test.TestRitDao.testSaveAndLoad(TestRitDao.java:26)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
   at java.lang.reflect.Method.invoke(Unknown Source)
   at junit.framework.TestCase.runTest(TestCase.java:154)
   at junit.framework.TestCase.runBare(TestCase.java:127)
   at junit.framework.TestResult$1.protect(TestResult.java:106)
   at junit.framework.TestResult.runProtected(TestResult.java:124)
   at junit.framework.TestResult.run(TestResult.java:109)
   at junit.framework.TestCase.run(TestCase.java:118)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)





Odpovedet emailem