Spring Data - 没有事务正在进行

标签 spring transactions spring-data spring-data-jpa spring-transactions

我正在尝试配置自定义 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/

相关文章:

java - 事务暂停在 Spring 中如何工作?

ruby-on-rails-3 - 轨道 3 : wrapping ActiveRecord operations and external credit card in a single transaction

spring - Spring JPA::找不到能够从类型转换的转换器

java - 具有任意 AND 子句的动态 spring 数据 jpa 存储库查询

spring - 响应中不存在刷新 token

Spring REST端点和服务层分离

spring - Spring MVC 测试中的空异常主体

java - 在事务中运行 SELECT + UPDATE 与单独使用 UPDATE 有不同的结果吗?

php - 使用 PDO 语句执行所有查询,或者不执行任何查询

spring-data-jpa - 是否有不等于条件的ExampleMatcher