Printemps TransactionRequiredException exception
Voici ma configuration du Référentiel:
@Configuration
public class RepositoryConfing {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter){
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource);
entityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter);
entityManagerFactoryBean.setPackagesToScan("com.imdb.model");
return entityManagerFactoryBean;
}
@Bean
public BasicDataSource dataSource(){
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("org.postgresql.Driver");
ds.setUrl("jdbc:postgresql://localhost:5432/imdb");
ds.setUsername("***");
ds.setPassword("***");
ds.setInitialSize(5);
return ds;
}
@Bean
public JpaVendorAdapter jpaVendorAdapter(){
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabase(Database.POSTGRESQL);
adapter.setShowSql(true);
adapter.setGenerateDdl(false);
adapter.setDatabasePlatform("org.hibernate.dialect.PostgreSQLDialect");
return adapter;
}
}
Quand je l'appelle merge
méthode, j'obtiens une exception: javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'merge' call
Est peut-être mon RepositoryConfig
manque de quelques configurations supplémentaires?
EDIT:
Mon nouveau Référentiel de configuration:
@Configuration
@EnableTransactionManagement
public class RepositoryConfing {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter){
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource);
entityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter);
entityManagerFactoryBean.setPackagesToScan("com.imdb.model");
return entityManagerFactoryBean;
}
@Bean
public BasicDataSource dataSource(){
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("org.postgresql.Driver");
ds.setUrl("jdbc:postgresql://localhost:5432/imdb");
ds.setUsername("***");
ds.setPassword("***");
ds.setInitialSize(5);
return ds;
}
@Bean
public JpaVendorAdapter jpaVendorAdapter(){
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabase(Database.POSTGRESQL);
adapter.setShowSql(true);
adapter.setGenerateDdl(false);
adapter.setDatabasePlatform("org.hibernate.dialect.PostgreSQLDialect");
return adapter;
}
@Bean
public PlatformTransactionManager txManager() {
return new DataSourceTransactionManager(dataSource());
}
}
Maintenant, il échoue avec StackOverflow
. Peut-être DataSourceTransactionManager
est pas adapté pour JPA?
- Pouvez-vous me montrer votre classe en faisant la
merge
appel ? Sont vos services/référentiels de beans spring ? Composant de numérisation ? - Vérifier les modifications s'il vous plaît. Tout fonctionne bien jusqu'à ce que j'appelle
merge
/persist
. - Vérifier ma réponse, je vais mettre à jour en conséquence, mais le truc, c'est que vous avez besoin d'un
JpaTransactionManager
avec un bean ID detransactionManager
Vous devez vous connecter pour publier un commentaire.
txManager
méthode devrait être renommétransactionManager
.JpaTransactionManager
au lieu d'unDataSourceTransactionManager
MODIFIER
Afin d'avoir pleinement fonctionnelle de la transaction avec JPA, vous devez :
@EnableTransactionManagement
sur votre fichier de configurationEntityManagerFactoryBean
JpaTransactionManager
(les haricots doivent être nomméstransactionManager
) créé avec votre déclarée précédemmentEntityManagerFactoryBean
@PersistenceContext
ou@Autowired
) unEntityManager
dans votre@Repository
(qui doit être un printemps bean)@Service
et l'utilisation d'un public méthode enrichies avec@Transactional
Bien sûr, cela est simplifiée, et je suppose que vous êtes à l'aide de java config, les annotations et les autocomponent de numérisation.