Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring JPA:从异步方法处理时,数据未保存到数据库_Spring_Hibernate_Spring Boot_Spring Data_Spring Data Jpa - Fatal编程技术网

Spring JPA:从异步方法处理时,数据未保存到数据库

Spring JPA:从异步方法处理时,数据未保存到数据库,spring,hibernate,spring-boot,spring-data,spring-data-jpa,Spring,Hibernate,Spring Boot,Spring Data,Spring Data Jpa,我有一个应用程序使用SpringJPA,并使用@AsyncSpring注释执行一些后台处理。该过程需要将参数保存在数据库中,或者如果数据库已经存在,则更新数据库 这不太好,因为@Async方法完成后,我的数据实体不会持久化到数据库中。但是当我从方法中删除@Async注释时,一切都很好。我的数据已保存或更新到数据库 有没有人知道我可能错了什么,或者我遗漏了什么 谢谢 **更新[代码示例] 异步服务 @Service @EnableAsync class AsyncService() { @

我有一个应用程序使用SpringJPA,并使用@AsyncSpring注释执行一些后台处理。该过程需要将参数保存在数据库中,或者如果数据库已经存在,则更新数据库

这不太好,因为@Async方法完成后,我的数据实体不会持久化到数据库中。但是当我从方法中删除@Async注释时,一切都很好。我的数据已保存或更新到数据库

有没有人知道我可能错了什么,或者我遗漏了什么

谢谢

**更新[代码示例]

异步服务

@Service
@EnableAsync
class AsyncService() {
    @Async
    public void process(firstEntity, secondEntity) {
        firstEntity = prepareParams(firstEntity);
        secondEntity = prepareParams(secondEntity);
        save(firstEntity, secondEntity);
    }
}
实体关系服务

@Transactional
@Service
class EntityRelationService() {

    private SecondEntityRepo secondEntityRepo;

    @Autowired
    public EntityRelationService(SecondEntityRepo secondEntityRepo) {
        this.secondEntityRepo = secondEntityRepo;
    }

    @Transactional
    public void save(p1, p2) {
        p2.setRelation(p1);

        this.secondEntityRepo(p2);
    }
}
BEAN配置

@Bean
@Primary
@ConfigurationProperties(prefix = "app.database")
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(driver);
    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    return dataSource;
}

@Bean
@Primary
public LocalSessionFactoryBean sessionFactory() {
    LocalSessionFactoryBean sf = new LocalSessionFactoryBean();
    sf.setDataSource(dataSource());
    sf.setPackagesToScan("com.app");
    Properties props = new Properties();
    props.put("hibernate.use_sql_comments", false);
    props.put("hibernate.show_sql", true);
    sf.setHibernateProperties(props);
    return sf;
}

@Bean
public HibernateTransactionManager transactionManager() {
    HibernateTransactionManager transactionManager =
            new HibernateTransactionManager();
    transactionManager.setSessionFactory(sessionFactory().getObject());
    return transactionManager;
}

我猜@Async方法与@Transactional方法在同一个类上

Be ware:@Async将创建一个新线程,该线程将不会是事务性的(因此不会写入数据库)。使用Spring代理,您的异步方法需要调用另一个类上的方法,才能恢复@Transactional


换句话说,使用@Async方法创建一个新的空类,该方法只调用原始类(具有@Transactional)中的主方法。

您能发布代码和SpringBean配置和设置吗?请提供。