2014-10-29 27 views
3

我已經安排了一個作業,註釋@Scheduled,該作業應該使用彈簧數據jpa處理數據並將其保存到數據庫。調用save方法時沒有任何異常,但沒有插入數據庫。在相同的註釋方法中,我調用了findAll方法,該方法工作正常並且獲取數據。什麼可能是一個原因?在@Scheduled中運行的作業不會調用彈簧數據jpa save

@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("..."))); 
    } 

} 

Maven的

 <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> 
+0

嘗試添加@Transactional上'scheduleCrawlerJob()' – Xstian 2014-10-29 08:35:12

+0

我已經試過了,但仍然沒有插入。我應該設置一些命令嗎?我使用彈簧靴。 – 2014-10-29 08:39:37

+0

我認爲有一個事務處於掛起狀態。在調試模式下,嘗試在entitymanager上執行flush()。無論如何,你可以添加更多的細節? (配置等) – Xstian 2014-10-29 08:43:17

回答

1

你的問題是由於有未進行提交的事務。

原因:

javax.persistence.TransactionRequiredException: no transaction is in progress 

下面就如何通過註解配置事務管理的例子。 Here the reference

@Configuration 
@EnableTransactionManagement 
public class PersistenceJPAConfig{ 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(){ 
     ... 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager(){ 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(
     entityManagerFactoryBean().getObject()); 
     return transactionManager; 
    } 

} 

添加上scheduleCrawlerJob@Transactional

@Scheduled(fixedRate=100000) 
@Transactional 
public void scheduleCrawlerJob() throws MalformedURLException { 
     Iterable<PossibleOfferLink> links = repo.findAll(); 
     PossibleOfferLink link = repo.save(new PossibleOfferLink(new URL("..."))); 
} 
+0

爲什麼在我調用任何'@ Controller'中的'repo.save(...)'時調用insert?無需配置事務管理器。 – 2014-10-29 09:57:45

+0

[查看本主題](http://stackoverflow.com/questions/23118789/spring-mvc-controller-shouldnt-be-transactional-why),所以交易將從控制器打開。 – Xstian 2014-10-29 09:59:06

+0

'缺省情況下,存儲庫實例上的CRUD方法是事務性的'意味着默認情況下它們以傳播REQUIRED運行,這意味着它們加入正在進行的事務,並且如果沒有任何事務在它們自己的事務中運行 - 這意味着'repo.save'應該位於當它從控制器或其他組件調用它時的事務。 – 2014-10-29 10:12:16

相關問題