Hi, This is also posted here: http://stackoverflow.com/questions/17887055/org-hibernate-persistentobjectexception-detached-entity-passed-to-persist-with
Please don't create a stackoverflow.com question _and_ at the same time use the mailing list. I suggest if somebody wants to answer he should do so on stackoverflow.com Regards, Thomas On Fri, Jul 26, 2013 at 8:58 PM, Mahmoud Saleh <[email protected]>wrote: > i am using H2 in memory database for testing and my configuration is as > follows: > > *1- SpringTestingConfig:* > > @Configuration > @ComponentScan(basePackages = "com.myapp.data", excludeFilters = { > @Filter(Configuration.class) }) > @PropertySource("classpath:/test.properties") > @Profile("test") > public class SpringTestingConfig { > @Bean > public DataSource dataSource() { > DriverManagerDataSource dataSource = new > DriverManagerDataSource(); > dataSource.setDriverClassName("org.h2.Driver"); > > dataSource.setUrl("jdbc:h2:mem:test;MODE=Mysql;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE > SCHEMA IF NOT EXISTS MYAPP"); > dataSource.setUsername("sa"); > dataSource.setPassword(""); > return dataSource; > } > } > > *2- MyTestClass:* > > @RunWith(SpringJUnit4ClassRunner.class) > @TestExecutionListeners({ WebContextTestExecutionListener.class, > DependencyInjectionTestExecutionListener.class, > DirtiesContextTestExecutionListener.class, > TransactionalTestExecutionListener.class }) > @ActiveProfiles("test") > @DirtiesContext > @ContextConfiguration(loader = AnnotationConfigContextLoader.class, > classes = { > SpringConfig.class, SpringTestingConfig.class, > SpringLocalContainerJPAConfig.class, CustomConfiguration.class }) > @PrepareForTest({ FacesContext.class }) > @PowerMockIgnore({ "javax.management.*", "javax.xml.parsers.*", > "com.sun.org.apache.xerces.internal.jaxp.*", "ch.qos.logback.*", > "org.slf4j.*" }) > public class MyTestClass{ > > @Test > public void signup(){ > this.company = userService.saveCompany(company); > this.user.setCompany(company); > this.user = userService.saveUser(this.user); // gives exception > } > > } > > *3- Save methods:* > > @Transactional(propagation = Propagation.REQUIRED) > public User saveUser(User user) { > return userRepository.saveAndFlush(user); //JpaRepository > } > > @Transactional(propagation = Propagation.REQUIRED) > public Company saveCompany(Company company) { > return companyRepository.saveAndFlush(company); //JpaRepository > } > > *4- JPA Config* > > @Configuration > @EnableSpringConfigured > public class SpringJNDIJPAConfig { > protected static final Logger logger = > LoggerFactory.getLogger(SpringConfig.class); > protected static final String HIBERNATE_TRANSACTION_JTA_PLATFORM = > "hibernate.transaction.jta.platform"; > > > @Value("${hibernate.naming_strategy:org.hibernate.cfg.DefaultNamingStrategy}") > private String namingStrategy; > > @Value("${hibernate.packages_to_scan:com.myapp.data.domain}") > private String packagesToScan; > > @Value("${spring_config.project_name}") > private String projectName; > > @Value("${hibernate.show_sql:false}") > private String showSql; > > @Value("${hibernate.hbm2ddl.auto:update}") > private String hbm2ddlAuto; > > @Value("${hibernate.format_sql:false}") > private String formatSql; > > > @Value("${hibernate.dialect:org.hibernate.dialect.MySQL5InnoDBDialect}") > private String hibernateDialect; > > @Value("${hibernate.connection.useUnicode:true}") > private String useUnicode; > > @Value("${hibernate.connection.characterEncoding:UTF-8}") > private String characterEncoding; > > @Value("${hibernate.charSet:UTF-8}") > private String charSet; > > @Value("${hibernate.default_schema}") > private String defaultSchema; > > @Value("${hibernate.use_default_schema:true}") > private boolean useDefaultSchema; > > @Value("${hibernate.use_sql_comments:true}") > private String useSqlComments; > > @Autowired > private ApplicationContext applicationContext; > > @Autowired > private DataSource dataSource; > > @Bean > public HibernateExceptionTranslator hibernateExceptionTranslator() { > return new HibernateExceptionTranslator(); > } > > @Bean > protected EntityManagerFactory entityManagerFactory() { > LocalContainerEntityManagerFactoryBean bean = new > LocalContainerEntityManagerFactoryBean(); > > JtaPersistenceUnitManager puManager = new > JtaPersistenceUnitManager(); > Map<String, DataSource> dataSources = new HashMap<String, > DataSource>(); > dataSources.put("dataSource", dataSource); > puManager.setDataSourceLookup(new MapDataSourceLookup(dataSources)); > puManager.setDefaultDataSource(dataSource); > puManager.setPackagesToScan(packagesToScan()); > bean.setPersistenceUnitManager(puManager); > > bean.setPersistenceProviderClass(HibernatePersistence.class); > bean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); > > Properties jpaProperties = getHibernateProperties(); > jpaProperties.put(HIBERNATE_TRANSACTION_JTA_PLATFORM, > SpringJtaPlatform.class.getName().toString()); > bean.setJpaProperties(jpaProperties); > > puManager.afterPropertiesSet(); > bean.afterPropertiesSet(); > return bean.getObject(); > } > > protected String getDefaultSchema() { > String ds = ConfigurationUtil.config().getString("db.schema.name"); > if (ds != null) defaultSchema = ds; > return defaultSchema; > } > > protected String getUseUnicode() { > return useUnicode; > } > > protected String getCharacterEncoding() { > return characterEncoding; > } > > protected String getCharSet() { > return charSet; > } > > protected String getFormatSql() { > return formatSql; > } > > protected String getHbm2ddlAuto() { > return hbm2ddlAuto; > } > > protected String getHibernateDialect() { > return hibernateDialect; > } > > protected Properties getHibernateProperties() { > Properties properties = new Properties(); > properties.put("hibernate.dialect", getHibernateDialect()); > properties.put("hibernate.hbm2ddl.auto", getHbm2ddlAuto()); > properties.put("hibernate.show_sql", getShowSql()); > properties.put("hibernate.use_sql_comments", getUseSqlComments()); > properties.put("hibernate.format_sql", getFormatSql()); > if(useDefaultSchema) { > properties.put("hibernate.default_schema", getDefaultSchema()); > } > //properties.put("hibernate.ejb.naming_strategy", namingStrategy); > properties.put("hibernate.hbm2ddl.import_files", "/import.sql"); > //properties.put("hibernate.connection.characterEncoding", > getCharacterEncoding()); > //properties.put("hibernate.connection.charSet", getCharSet()); > //properties.put("hibernate.connection.useUnicode", getUseUnicode()); > if(logger.isInfoEnabled()) { > logger.info(MessageFormat.format("SET HIBERNATE PROPERTIES: {0}", > properties.toString())); > } > return properties; > } > > protected String getProjectName() { > return projectName; > } > > protected String getShowSql() { > return showSql; > } > > protected String getUseSqlComments() { > return useSqlComments; > } > > protected String packagesToScan() { > return packagesToScan; > } > > @Bean > protected JtaTransactionManager transactionManager() { > SpringBeanFactory.setApplicationContext(applicationContext); > JtaTransactionManager manager = new JtaTransactionManager(); > manager.setTransactionManagerName("java:jboss/TransactionManager"); > manager.setUserTransactionName("java:jboss/UserTransaction"); > manager.afterPropertiesSet(); > return manager; > } > > } > > *ISSUE*: the code in test method works very fine when running the > application (local database), but when running it from test (in memory > database) it saves company and when trying to save user it gives the > exception: > > org.springframework.dao.InvalidDataAccessApiUsageException: detached > entity passed to persist: com.myapp.data.domain.Company; nested exception > is org.hibernate.PersistentObjectException: detached entity passed to > persist: com.myapp.data.domain.Company > at > org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:668) > at > org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:106) > at > org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:403) > at > org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:58) > at > org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213) > at > org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:163) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) > at > org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeRepositoryPostProcessor.java:92) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) > at > org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) > at > org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) > at com.myapp.service.UserService.saveUser(UserService.java:95) > at > com.myapp.service.UserService$$FastClassByCGLIB$$697e2a1b.invoke(<generated>) > at > org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) > at > org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) > at > org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96) > at > org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260) > at > org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) > at > org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631) > at > com.myapp.service.UserService$$EnhancerByCGLIB$$83ca6add.saveUser(<generated>) > at com.myapp.web.controllers.SignUpBean.signup(SignUpBean.java:226) > at > test.myapp.web.controllers.SignUpBeanTest.testSignUpProcess(SignUpBeanTest.java:124) > at > org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) > 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.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88) > 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.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.PersistentObjectException: detached entity > passed to persist: com.myapp.data.domain.Company > at > org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141) > at > org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:842) > at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:835) > at > org.hibernate.ejb.engine.spi.EJB3CascadingAction$1.cascade(EJB3CascadingAction.java:53) > at > org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:387) > at > org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:330) > at > org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208) > at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165) > at > org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:424) > at > org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:263) > at > org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:192) > at > org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:135) > at > org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:78) > at > org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:208) > at > org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:151) > at > org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78) > at > org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:852) > at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:826) > at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:830) > at > org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:875) > at > org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:241) > at > org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:354) > at > org.springframework.data.jpa.repository.support.SimpleJpaRepository.saveAndFlush(SimpleJpaRepository.java:368) > at > org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:333) > at > org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:318) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) > at > org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96) > at > org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260) > at > org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) > at > org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) > at > org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155) > ... 33 more > > -- > You received this message because you are subscribed to the Google Groups > "H2 Database" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/h2-database. > For more options, visit https://groups.google.com/groups/opt_out. > > > -- You received this message because you are subscribed to the Google Groups "H2 Database" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/h2-database. For more options, visit https://groups.google.com/groups/opt_out.
