Hibernate Books

All times are UTC - 5 hours [ DST ]



Post new topic Reply to topic  [ 1 post ] 
Author Message
 Post subject: @Version cause une TransientObjectException
PostPosted: Sat May 19, 2012 8:09 am 
Newbie

Joined: Sat May 19, 2012 7:42 am
Posts: 4
Bonjour,

Je souhaite réaliser une mini application Blog. J'ai donc 2 classes : Ticket et Comment (code dans la suite).

Pas de problème quand je sauvegarde un Ticket qui a plusieurs Comments (sauvegardés en cascade).
En revanche quand je cherche à sauvegarder uniquement un Comment, j'ai une exception (trace en fin du post). J'ai remarqué qu'en commentant l'annotation "Version" sur mon ticket, je n'ai plus l'erreur.
Comment je peux sauvegarder uniquement mon Comment sans retirer l'annotation Version ?
Est-ce une erreur d'utilisation de ma part ? Ou est-ce plus complexe ?

J'utilise les versions :
- Spring : 3.1.1.RELEASE
- Hibenate : 4.1.1.Final
- Hibernate Validator : 4.3.0.Final

Classe Ticket :
Code:
@Entity
public class Ticket implements AutoCreationDate, Serializable {
...
   @Id
   @GeneratedValue
   @Column(name = "id_ticket")
   public Integer getIdTicket() {
      return idTicket;
   }

   @Version
   @Column(name = "last_update")
   public Date getLastUpdate() {
      return lastUpdate;
   }

   @OneToMany(cascade = { CascadeType.ALL }, mappedBy = "ticket")
   public Collection<Comment> getComments() {
      return comments;
   }
}


Et la classe Comment :
Code:
@Entity
public class Comment implements Serializable {
...
   @Id
   @GeneratedValue
   @Column(name = "id_comment")
   public Integer getIdComment() {
      return idComment;
   }

   @ManyToOne(cascade = {}, fetch = FetchType.LAZY)
   @JoinColumn(name = "id_ticket")
   public Ticket getTicket() {
      return ticket;
   }
}


Le code de test :
Code:
        @Test
   public void testSave() {
      final Comment c = new Comment();
      c.setTicket(ticketDAO.findById(2));

      commentDAO.save(c);
       }


Avec dans mon DAO :
Code:
   @Override
   public void save(Dto dto) {
      sessionFactory.getCurrentSession().saveOrUpdate(dto);
   }


L'exception générée :
Code:
org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before flushing: fr.dush.test.dblog.dto.model.Ticket; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: fr.dush.test.dblog.dto.model.Ticket
   at org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:187)
   at org.springframework.orm.hibernate4.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:606)
   at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:488)
   at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
   at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
   at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
   at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
   at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
   at $Proxy37.save(Unknown Source)
   at fr.dush.test.dblog.dao.CommentDAOImplTest.testSave(CommentDAOImplTest.java:108)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke(Method.java:601)
   at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
   at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
   at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
   at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
   at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
   at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
   at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
   at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
   at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
   at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
   at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
   at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
   at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
   at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
   at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
   at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
   at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
   at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
   at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
   at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
   at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
   at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: fr.dush.test.dblog.dto.model.Ticket
   at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:249)
   at org.hibernate.type.EntityType.getIdentifier(EntityType.java:456)
   at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:276)
   at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:286)
   at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:294)
   at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:3820)
   at org.hibernate.event.internal.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:536)
   at org.hibernate.event.internal.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:243)
   at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:172)
   at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:225)
   at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
   at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
   at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1127)
   at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:325)
   at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
   at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
   at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:480)
   ... 38 more


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.