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)