我正在尝试配置自定义 Spring 数据存储库来替换 spring 的某些功能。
在@Repository
接口(interface)中一切正常,但在@Repository
实现中,我没有事务。
错误:
javax.persistence.TransactionRequiredException: no transaction is in progress
这是我的配置文件:
@Configuration
@ComponentScan ({"com.app.core.authentication", "com.app.core.service","com.app.core.repository"})
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.app.core.repository"})
public class AppCoreConfiguration implements TransactionManagementConfigurer {
@Bean
public DataSource dataSource() {
DataSource dataSource = null;
try {
Context ctx = new InitialContext();
dataSource = (DataSource) ctx.lookup("java:jboss/postgresDS");
} catch (NamingException e) {
e.printStackTrace();
}
return dataSource;
}
@Bean
public EntityManagerFactory entityManagerFactory() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
vendorAdapter.setShowSql(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("com.app.core.entity");
factory.setDataSource(dataSource());
factory.afterPropertiesSet();
return factory.getObject();
}
@Bean
public PlatformTransactionManager transactionManager() {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory());
txManager.setDataSource(dataSource());
return txManager;
}
@Bean
public HibernateExceptionTranslator hibernateExceptionTranslator(){
return new HibernateExceptionTranslator();
}
@Bean
public EntityManager entityManger () {
return entityManagerFactory().createEntityManager();
}
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return transactionManager();
}
}
还有我的存储库类:
@Repository
public class ClientRepository extends JPABaseRepository<String, Client> implements IClientRepository {
@Autowired
public ClienteRepository (EntityManager em) {
super(Cliente.class, em);
}
@Override
@Transactional
public Cliente save(Client client) {
return saveAndFlush(client);
}
}
以及界面:
@NoRepositoryBean
public interface IClientRepository extends IJPABaseRepository<String, Client> {
...
}
有人知道为什么这个自定义@Repository
类没有获得事务管理器吗?
这很奇怪,因为所有未实现的接口(interface)都可以正常工作......
我已经尝试将@Transaction
的注释放在任何地方...包括从RESOURCE_LOCAL更改为JTA等等...
最佳答案
当使用扩展 Spring Data JPA 的自定义 JPA 存储库时,您需要一个工厂来创建这些存储库的实例。正如 Spring Data JPA documentation 中提到的.
您当前方法的问题在于您正在创建一个非 spring 管理的 EntityManager
实例。
@Bean
public EntityManager entityManger () {
return entityManagerFactory().createEntityManager();
}
通常 Spring 会创建一个 transaction aware proxy对于 EntityManager
但在您的情况下(由于 @Bean
方法),您的自定义实现会获得一个普通的 EntityManager
。创建一个工厂(如上所述)将解决这个问题。
关于Spring Data - 没有事务正在进行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20182388/