2017-01-09 64 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代理)