java Spring TransactionRequiredException 异常
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/32722054/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Spring TransactionRequiredException exception
提问by serhii
Here is my Repository configuration:
这是我的存储库配置:
@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;
}
}
When I call merge
method, I get an exception: javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'merge' call
当我调用merge
方法时,出现异常:javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'merge' call
May be my RepositoryConfig
is lacking of some additional configurations?
可能是我RepositoryConfig
缺少一些额外的配置?
EDIT: My new Repository 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());
}
}
Now it fails with StackOverflow
. May be DataSourceTransactionManager
is not suit for JPA?
现在它失败了StackOverflow
。可能DataSourceTransactionManager
不适合 JPA?
回答by Alexandre Jacob
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
- Your
txManager
method should be renamed totransactionManager
. - You need to have a
JpaTransactionManager
instead of aDataSourceTransactionManager
- 您的
txManager
方法应重命名为transactionManager
. - 你需要有一个
JpaTransactionManager
而不是一个DataSourceTransactionManager
EDIT
编辑
In order to have fully functional transaction with JPA you need to :
为了与 JPA 进行功能齐全的事务,您需要:
- Use
@EnableTransactionManagement
on your configuration file - Declare an
EntityManagerFactoryBean
- Declare a
JpaTransactionManager
(the bean must be namedtransactionManager
) created with your previously declaredEntityManagerFactoryBean
- Inject (with
@PersistenceContext
or@Autowired
) anEntityManager
in your@Repository
(which must be a spring bean) - Call your repository from a
@Service
and use a publicmethod anotated with@Transactional
- 使用
@EnableTransactionManagement
您的配置文件 - 声明一个
EntityManagerFactoryBean
- 声明一个
JpaTransactionManager
(bean 必须被命名transactionManager
)用你之前声明的EntityManagerFactoryBean
- 注射(有
@PersistenceContext
或@Autowired
)一个EntityManager
在你的@Repository
(必须是一个Spring bean) - 从 a 调用您的存储库
@Service
并使用带有注释的公共方法@Transactional
Of course this is simplified and I assume you are using java config, annotations, and autocomponent scanning.
当然,这是简化的,我假设您正在使用 java 配置、注释和自动组件扫描。