我在一个带有嵌入式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()
方法后都必须添加任何代码?
如果没有,我完全不知道如何调试这类问题,因为我不得不承认,我不确定最后会发生什么事情。
答案 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代理之后)