2016-11-26 2 views
0

ich mit JPA Frühling Daten 1.10.5 mit 2.1 und Spring 4.3Spring Data Fehler auf Abfrage lösen nach

Hier meine Konfiguration

@Bean 
    public JpaTransactionManager transactionManager(){ 
     JpaTransactionManager res = new JpaTransactionManager(); 
     res.setEntityManagerFactory(entityManagerFactory()); 

     return res; 
    } 

@Bean 
    public EntityManagerFactory entityManagerFactory() throws PropertyVetoException{ 
     LocalContainerEntityManagerFactoryBean res = new LocalContainerEntityManagerFactoryBean(); 
     res.setDataSource(datasource()); 
     res.setPackagesToScan("com.myapp.core.model"); 

     Map<String,Object> jpaPropertiesMap = new HashMap<>(); 
     jpaPropertiesMap.put("hibernate.hbm2ddl.auto", hibernateHbm2ddl); 
     res.setJpaPropertyMap(jpaPropertiesMap); 


     HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter(); 
     hibernateJpaVendorAdapter.setShowSql(hibernateShowSql); 
     hibernateJpaVendorAdapter.setDatabasePlatform(hibernateDialect); 
     res.setJpaVendorAdapter(hibernateJpaVendorAdapter); 
     res.afterPropertiesSet(); 

     return res.getObject(); 
    } 

    @Bean 
    public DataSource datasource() throws PropertyVetoException { 
     ComboPooledDataSource pooledDataSource = new ComboPooledDataSource(); 
     pooledDataSource.setDriverClass(dbDriverClassName); 
     pooledDataSource.setJdbcUrl(dbUrl); 
     pooledDataSource.setUser(dbUser); 
     pooledDataSource.setPassword(dbPassword); 
     pooledDataSource.setMinPoolSize(2); 
     pooledDataSource.setInitialPoolSize(5); 
     pooledDataSource.setMaxPoolSize(20); 
     pooledDataSource.setMaxIdleTime(14400); 
     pooledDataSource.setIdleConnectionTestPeriod(21600); 

     return pooledDataSource; 
    } 

Ich habe einige einfache Einheiten mit einfachen Beziehungen

@Entity 
@Table(name = "advertising") 
public class Advertising{ 
    @ManyToOne 
    private WebUserStatus webUserStatus; 
    @ManyToOne 
    private Location location; 
    ... ... 
} 

alles war in Ordnung für ein Jahr gearbeitet, aber wenn ich den folgenden Code

entityM anager.detach (werbungOne); gefolgt von einer Abfrage (Es ist nur eine Auswahl. So etwas, das Daten liest und nichts schreiben) auf dem WebUserStatus habe ich den folgenden Fehler. Der Fehler ist seltsam und ich verstehe nicht, warum sich der Fehler auf die Location-Entität bezieht, auf der ich nichts getan habe.

javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.myapp.core.model.Location 
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:147) 
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155) 
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1407) 
    at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1444) 
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:210) 
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:82) 
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:116) 
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:106) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:482) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:460) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
    at com.sun.proxy.$Proxy100.getActiveStatus(Unknown Source) 
    at com.myapp.core.manager.WebUserStatusManager.getActiveStatus(WebUserStatusManager.java:16) 

Bitte, können Sie mir helfen?

+0

Setzen Sie den Kaskadentyp auf PERSIST und DETACH für die Position. – Vaelyr

+0

Ich denke, du hast Recht und ich habe vergessen, in der Frage hinzuzufügen, aber die Kaskade ALL war da. Ich habe einen neuen Test durchgeführt, und ich bin mir sicher, dass die Kaskade nicht funktioniert. Ich benutze die Kaskade, die von JPA kommt. Ist es möglich, dass ich den Hibernate benutzen muss? – Gavi

+0

Sie können versuchen, diese Kaskaden nur explizit in einem Array anzuzeigen oder Hibernates SAVE_UPDATE zu versuchen. Ich würde ALL nirgendwo empfehlen, es hat ein seltsames Verhalten. – Vaelyr

Antwort

0

Ich arbeitete mit einer @ Transactional Testmethode.

In der Produktionsumgebung ist alles in Ordnung, aber in den Tests fehlt etwas.

Um eine saubere Situation zu haben, wird manchmal ein entityManager.clear() benötigt;

Verwandte Themen