Spring Boot - 直接将事务保存到嵌入式数据库

时间:2017-01-09 10:27:22

标签: java spring hibernate spring-boot spring-data-jpa

我在一个带有嵌入式H2数据库的独立GUI(Swing)java应用程序中使用Spring Boot Jpa。

我使用Spring Boot 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注释来修改数据库中的数据。

我对数据库不是很有经验,但在谷歌搜索之后,我猜这些事务是由持久化上下文缓存的(不确定术语是否正确),并且在应用程序关闭时实际上是持久化的。我检查了数据库文件并通过GUI进行了一些操作(还包括一些查询),但只有在我关闭应用程序时才更改数据库文件的修改日期。

由于这是一个独立的GUI应用程序,如果每个事务都直接在数据库中存在,就不会出现性能问题。我是否正确的方式,我怎么能实现每个事务直接持久存储在数据库中?我是否需要执行任何配置,或者每次调用存储库的save()方法后都必须添加任何代码?

如果没有,我完全不知道如何调试这类问题,因为我不得不承认,我不确定最后会发生什么事情。

2 个答案:

答案 0 :(得分:0)

Hibernate根据优化参数和配置的刷新策略决定何时写入数据库(刷新持久化上下文)。

也许你可以看看这里并根据你的需要调整行为:

https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch03.html

有关刷新模式的信息也可以帮助您:

http://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/FlushMode.html

答案 1 :(得分:0)

Springs @Transactional遵循容器管理的事务范例。默认情况下,如果一个@Transactional在另一个Componet / service / repository中调用@Transactional方法,则会传播该事务。当最外面的@Transactional方法完成时,事务将被提交到数据库。

JPA可能会在同一事务中多次将数据刷新到数据库,但事务中的所有内容都会在事务完成时提交或回滚。如果在@Controller上有@Transactional,则事务在DispatchServlet调用处理程序方法之后完成(更具体地说,它发生在使用Spring AOP创建的GCLIB或JDK代理之后)