Man*_*asz 6 java spring hibernate jpa spring-data-jpa
我已经安排了一个带有 annotation 的作业@Scheduled,它应该使用 spring data jpa 处理数据并将其保存到数据库中。save调用该方法没有任何异常,但没有插入数据库。在同一个带注释的方法中,我调用了findAll工作正常并获取数据的方法。可能是什么原因?
@Repository
public interface PossibleOfferLinkRepository extends PagingAndSortingRepository<PossibleOfferLink, Long> {
}
@Configuration
@ComponentScan
@EnableAutoConfiguration
@Import({Scheduler.class})
@EntityScan(basePackages="model_package")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@EnableScheduling
@ConditionalOnProperty(value= "property_name")
public class Scheduler {
...
@Scheduled(fixedRate=100000)
public void scheduleCrawlerJob() throws MalformedURLException {
Iterable<PossibleOfferLink> links = repo.findAll();
PossibleOfferLink link = repo.save(new PossibleOfferLink(new URL("...")));
}
}
Run Code Online (Sandbox Code Playgroud)
马文
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.1.8.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.182</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>org.easytesting</groupId>
<artifactId>fest-assert</artifactId>
<version>${easytesting.version}</version>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
最后我用这种方式解决了这个问题:
添加@EnableTransactionManagement到Application类中,同时添加了
PlatformTransactionManagerBean。检查以下代码:
@Autowired
private EntityManagerFactory entityManagerFactory;
@Bean
public PlatformTransactionManager transactionManager()
{
return new JpaTransactionManager(entityManagerFactory);
}
Run Code Online (Sandbox Code Playgroud)
这是进口:
导入 org.springframework.orm.jpa.JpaTransactionManager; 导入 org.springframework.scheduling.annotation.EnableScheduling; 导入 org.springframework.transaction.PlatformTransactionManager; 导入 org.springframework.transaction.annotation.EnableTransactionManagement;
在我的调度程序代码中添加了以下代码:
@Scheduled(fixedRate = 60 *10*1000)
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void reportCurrentTime() {
doDatabaseTransaction();
}
Run Code Online (Sandbox Code Playgroud)这是进口:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
Run Code Online (Sandbox Code Playgroud)
希望这能解决您的问题:)
您的问题是由于没有正在进行的事务需要提交。
原因:
javax.persistence.TransactionRequiredException: no transaction is in progress
Run Code Online (Sandbox Code Playgroud)
这里有一个关于如何通过注释配置事务管理器的示例。 这里参考一下
@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig{
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(){
...
}
@Bean
public PlatformTransactionManager transactionManager(){
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(
entityManagerFactoryBean().getObject() );
return transactionManager;
}
}
Run Code Online (Sandbox Code Playgroud)
添加在scheduleCrawlerJob @Transactional
@Scheduled(fixedRate=100000)
@Transactional
public void scheduleCrawlerJob() throws MalformedURLException {
Iterable<PossibleOfferLink> links = repo.findAll();
PossibleOfferLink link = repo.save(new PossibleOfferLink(new URL("...")));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7474 次 |
| 最近记录: |