如何使用Spring Data JPA将数据保存在H2数据库中

时间:2018-10-27 05:02:49

标签: spring-boot spring-data-jpa h2

我想要使用H2作为数据库使用JavaFx,Spring Boot和Spring Data JPA创建一个桌面应用程序。问题是我试图运行Junit将数据本地保存在目录中,但是每次运行Junit时数据都会丢失。

我的application.properties文件;

spring.output.ansi.enabled=ALWAYS                    
spring.datasource.url=jdbc:h2:mem:test; 
DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;
spring.datasource.platform=h2
spring.datasource.username = sa
spring.datasource.password =
spring.datasource.driverClassName = org.h2.Driver
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.generate-ddl=true

我的测试用例;

HotelEntity hotelEntity = new HotelEntity(1, "Name", "Password", "MobileNumber", "email");
hotelDao.save(hotelEntity);
System.out.println("Hotel Dao--");
List<HotelEntity> hotelEntities = hotelDao.findAll();
System.out.println(hotelEntities.size());

它打印列表大小为1,但是当我再次像这样运行测试用例时

List<HotelEntity> hotelEntities = hotelDao.findAll();
System.out.println(hotelEntities.size());

它打印列表大小为0

1 个答案:

答案 0 :(得分:1)

问题在于,在测试期间,如果没有正确的事务定义,将不会提交您创建的任何数据。我的建议是;

  • 将测试h2 db与生产h2 db分开,非常危险,将两者同时使用。例如,您可以使用jdbc:h2:mem:test进行测试,而使用jdbc:h2:mem:main进行生产数据库。

  • 添加spring.jpa.hibernate.ddl-auto=update用于生产数据库配置,以及spring.jpa.hibernate.ddl-auto=create-drop用于测试。由于您不想保留测试数据库。

  • 如果您尝试从测试逻辑提交数据,则需要检查this question

要在会话之间访问h2,还需要使用一个额外的选项,即AUTO_RECONNECT,可以将它们添加到您的网址中吗?

spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE