2017-01-09 139 views
0

我使用Spring引導JPA在一個獨立的圖形用戶界面(鞦韆)的Java應用程序與嵌入式數據庫H2。春季啓動 - 堅持直接交易嵌入式數據庫

我使用Spring 1.3.0啓動,這是我的其他配置:

private static final String dataSourceUrl = "jdbc:h2:./databse;DB_CLOSE_ON_EXIT=FALSE"; 
    @Bean 
    public DataSource dataSource() { 
     return DataSourceBuilder.create().url(dataSourceUrl).username("user").password("pwd").build(); 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { 
     LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
     em.setDataSource(dataSource); 
     em.setPackagesToScan(new String[] { "packages.to.scan" }); 

     JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     em.setJpaVendorAdapter(vendorAdapter); 

     Properties properties = new Properties(); 
     properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); 
     properties.setProperty("hibernate.hbm2ddl.auto", "update"); 
     em.setJpaProperties(properties); 

     return em; 
    } 

在我application.properties文件我只有一個行:spring.aop.proxy-target-class=true

對於我的倉庫我向JpaRepository

一切工作,最近我唯一的問題:在其上運行的應用程序中的MAC的MAC有一些這樣那樣的問題而墜毀。之後,之前完成的修改都沒有實際存儲在數據庫中。我使用@Transactional註釋修改數據庫中的數據。

我對數據庫不是很有經驗,但在google搜索後我猜想事務被持久化上下文緩存(不知道術語是否正確)並且在應用程序關閉時實際上持久化。我檢查了數據庫文件,並通過GUI做了一些調整(包括一些查詢),但數據庫文件的修改日期只在我關閉應用程序時才改變。

由於這是一個獨立的GUI應用程序不會有性能問題,如果每一筆交易都會在數據庫中直接perisisted。我的方式是否正確,我如何實現每個事務都直接保存在數據庫中?是否有配置我必須做或我必須在每次調用存儲庫的save()方法後添加任何代碼?

如果沒有,我完全不知道怎麼,我不得不承認,我不是很確定什麼引擎蓋下居然能上調試這類問題..

+0

更改保存到一旦數據庫交易已經承諾並被刷新。後者通常在交易完成後很短時間內發生,而不是在您停止應用程序時發生。你有沒有檢查,你的交易限制不是太大?如果您只對整個應用程序使用一個事務,則只有在您停止應用程序時纔可能提交。 – dunni

+0

至少我不會在整個應用程序中故意使用一個事務。我添加了一些函數'propagation = Propagation.REQUIRES_NEW',並在調用這個函數的GUI中做了一些事情,但結果是一樣的:數據庫文件只在關閉應用程序時才被修改。 – Semaphor

回答

0

泉@交易遵循容器管理的交易範例。默認情況下,如果一個@Transactional在另一個Componet/service/repository中調用@Transactional方法,則事務將被傳播。當最外層的@Transactional方法完成時,事務將被提交到數據庫。

JPA可以在同一事務中刷新數據到數據庫中的多個時間,但一切都在事務提交或回滾當交易完成。如果你有@Transactional上@Controller,該DispatchServlet已調用處理方法之後在事務結束(更具體地說,它發生indside其中創建使用Spring AOP的GCLIB或JDK代理)