1

I thought that I can do persist using the method persist of entitymanager in my objects of spring. Actually I use spring roo. But when I take a object from database I cannot do it:

object.persist(); // <--- it doesn't work

Do anyone know why? and where can I find the documentation?

I'm getting this exception:

 org.springframework.orm.jpa.JpaSystemException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.movi.duckury.server.domain.LoginLog; nested exception is javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.movi.duckury.server.domain.LoginLog
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:311)
at org.springframework.orm.jpa.aspectj.JpaExceptionTranslatorAspect.ajc$afterThrowing$org_springframework_orm_jpa_aspectj_JpaExceptionTranslatorAspect$1$18a1ac9(JpaExceptionTranslatorAspect.aj:15)
at com.movi.duckury.server.domain.LoginLog_Roo_Entity.ajc$interMethod$com_movi_duckury_server_domain_LoginLog_Roo_Entity$com_movi_duckury_server_domain_LoginLog$persist(LoginLog_Roo_Entity.aj:54)
at com.movi.duckury.server.domain.LoginLog.persist(LoginLog.java:1)
at com.movi.duckury.server.domain.LoginLog_Roo_Entity.ajc$interMethodDispatch1$com_movi_duckury_server_domain_LoginLog_Roo_Entity$com_movi_duckury_server_domain_LoginLog$persist(LoginLog_Roo_Entity.aj)
at com.movi.duckury.server.web.LoginLogControllerTest.findLoginLogsBySessionIdTest(LoginLogControllerTest.java:101)
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:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
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: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.movi.duckury.server.domain.LoginLog at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214) at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147) at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1153) at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:678) at sun.reflect.GeneratedMethodAccessor21.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240) at sun.proxy.$Proxy54.persist(Unknown Source) ... 34 more Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.movi.duckury.server.domain.LoginLog at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:127) at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61) at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:808) at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:782) at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:786) at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:672) ... 39 more

Thanks.

Josema
  • 445
  • 2
  • 6
  • 22
  • Are you getting an Exceptions, or it's just not persisting? – CodeChimp Mar 18 '13 at 14:58
  • In general you should try to provide as much relevant data/code as possible. Try providing code for your entity object and any error stacktraces in order for us to isolate any errors. – pestrella Mar 18 '13 at 15:18

2 Answers2

3

Because it ie already persisted. A primary key conflict will occur, basically.

Use object.merge() (if I recall correctly the name of the method created by Roo)

Stefano

Stefano Cazzola
  • 1,597
  • 1
  • 20
  • 36
  • I believe the actual exception thrown is because the object is detached in this case (although it means that it is persisted as well). At any rate merge() will take care of it. – rootkit Mar 18 '13 at 16:46
  • Why is dettached? I have a problem... very strange. When I run the tests, if I load different application context in different test, this fail. I don't know why. – Josema Mar 18 '13 at 17:35
  • For example if I do @ContextConfiguration(locations = "classpath:META-INF/spring/applicationContext1.xml") and @ContextConfiguration(locations = "classpath*:META-INF/spring/applicationContext2.xml") and applicationContext2 import applicationContext1 this fail – Josema Mar 18 '13 at 17:48
  • Does the second context contain something more than the import? – Stefano Cazzola Mar 18 '13 at 20:12
  • it has a contex:component-scan to get the controllers as beans and in this way to do @autowire. – Josema Mar 20 '13 at 10:57
  • does it throw an exception or is it the test that fails? can you post the reason of the error? – Stefano Cazzola Mar 20 '13 at 15:08
  • When I run individual tests, this works and when I run all the test toguether fails. There are differents errors, like detached entity passed to persist or violationException: could not insert or could not execute query. Every error is in different tests – Josema Mar 21 '13 at 12:26
  • Sounds like you're persisting the same entity sevaral times. Try mark all your tests with `@Transactional` and `@Rollback(true)`. This should allow you to run every test in a clean environment. This is only a guess, hope will help you. – Stefano Cazzola Mar 21 '13 at 14:48
  • I got to solve :), I created a new question for this: [link]http://stackoverflow.com/questions/15547767/jpa-problems-running-multiple-tests-with-spring[/link] thanks @Stefano – Josema Mar 21 '13 at 18:43
1

JPA EntityManager: Why use persist() over merge()?

http://www.objectdb.com/java/jpa/persistence/store

Community
  • 1
  • 1
rootkit
  • 2,165
  • 2
  • 29
  • 43