在@Scheduled中运行的作业不会调用spring data jpa的保存操作。
在@Scheduled中运行的作业不会调用spring data jpa的保存操作。
我使用注解@Scheduled
安排了一个任务,该任务应该使用Spring Data JPA处理数据并将其保存到数据库中。save
方法被调用时没有出现异常,但是数据库中没有插入数据。在同一个注解方法中,我调用了findAll
方法,它正常工作并获取数据。可能的原因是什么?
可能的原因是在调用save
方法时,数据没有成功保存到数据库中。可能是由于数据库连接问题、事务管理问题或其他错误导致的。您可以检查数据库连接配置、事务管理器配置和数据库日志以查找问题。
另外,您可以检查save
方法是否在事务中执行。如果没有事务管理器配置或save
方法没有在事务中执行,数据可能不会保存到数据库中。您可以在Scheduler
类上添加@Transactional
注解来确保save
方法在事务中执行。
此外,您还可以检查数据库表结构是否正确,并确保PossibleOfferLink
实体类的数据可以正确映射到数据库表中。
另外,您的代码中还有一些依赖项,例如Spring Boot Starter Parent、Spring Boot Starter Data JPA、Spring Boot Starter Batch等。您可以检查这些依赖项的版本是否与您的代码兼容,并确保它们已正确配置和引入。
问题的原因是在调用`repo.save`方法时没有进行事务提交。出现这个问题的原因是定时任务没有开启事务。
解决方法是通过注解配置事务管理器,并在调用`repo.save`方法之前开启事务。
以下是一个配置事务管理器的示例代码:
public class PersistenceJPAConfig{ public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(){ ... } public PlatformTransactionManager transactionManager(){ JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject()); return transactionManager; } }
在`scheduleCrawlerJob`方法中添加以下代码:
@Scheduled(fixedRate=100000) public void scheduleCrawlerJob() throws MalformedURLException { Iterablelinks = repo.findAll(); PossibleOfferLink link = repo.save(new PossibleOfferLink(new URL("..."))); }
在调用`repo.save`方法之前开启事务可以解决这个问题。
在 @Scheduled 注解下,job没有调用 spring data jpa 的 save 方法的解决方法如下:
1. 在 Application 类中添加以下代码,并且添加 PlatformTransactionManager Bean:
private EntityManagerFactory entityManagerFactory; public PlatformTransactionManager transactionManager() { return new JpaTransactionManager(entityManagerFactory); }
以下是需要导入的包:
import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement;
2. 在调度器代码中添加以下代码:
@Scheduled(fixedRate = 60 *10*1000) @Transactional(propagation=Propagation.REQUIRES_NEW) public void reportCurrentTime() { doDatabaseTransaction(); }
以下是需要导入的包:
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional;
希望这能解决你的问题 🙂