Spring Boot JPA 和 H2 记录未持久化
Posted
技术标签:
【中文标题】Spring Boot JPA 和 H2 记录未持久化【英文标题】:Spring Boot JPA & H2 Records Not Persisted 【发布时间】:2015-01-08 15:29:55 【问题描述】:作为基线,我使用的是 Spring Boot 演示 Accessing Data JPA。
我的目标是能够使用 h2 控制台查看持久化的实体。我可以使用 Maven 运行应用程序,但是当我随后连接到 h2 控制台时,数据库是空的。
如果我设置了spring.jpa.hibernate.ddl_auto=none
,那么应用程序就不会运行,所以我知道这个值是从src/main/resources
获取的,但是我将它设置为create
或update
,数据库仍然是空的在mvn spring-boot:run
运行结束时。
在 Spring 和 Hibernate 的过去版本中,我设置了 auto_dll=create,并且 Hibernate 已经创建了数据库,如果它不存在的话。这不再起作用了吗?
这是更新后的示例应用程序的样子,减去导入声明:
@Configuration
@EnableAutoConfiguration
public class Application
@Bean
public DataSource dataSource()
HikariConfig config = new HikariConfig();
config.setDriverClassName("org.h2.Driver");
config.setJdbcUrl("jdbc:h2:file:~/db1");
config.setUsername("sa");
config.setPassword("");
return new HikariDataSource(config);
public static void main(String[] args)
ConfigurableApplicationContext context = SpringApplication.run(Application.class);
CustomerRepository repository = context.getBean(CustomerRepository.class);
// save a couple of customers
repository.save(new Customer("Jack", "Bauer"));
repository.save(new Customer("Chloe", "O'Brian"));
repository.save(new Customer("Kim", "Bauer"));
repository.save(new Customer("David", "Palmer"));
repository.save(new Customer("Michelle", "Dessler"));
// fetch all customers
Iterable<Customer> customers = repository.findAll();
System.out.println("Customers found with findAll():");
System.out.println("-------------------------------");
for (Customer customer : customers)
System.out.println(customer);
System.out.println();
// fetch an individual customer by ID
Customer customer = repository.findOne(1L);
System.out.println("Customer found with findOne(1L):");
System.out.println("--------------------------------");
System.out.println(customer);
System.out.println();
// fetch customers by last name
List<Customer> bauers = repository.findByLastName("Bauer");
System.out.println("Customer found with findByLastName('Bauer'):");
System.out.println("--------------------------------------------");
for (Customer bauer : bauers)
System.out.println(bauer);
context.close();
TIA, - 奥莱
【问题讨论】:
【参考方案1】:默认情况下,JPA 数据库配置设置为在开头创建表并在结尾删除。这可以通过 application.properties 文件中的以下条目进行更改:
spring.jpa.hibernate.ddl-auto=update
参见参考here。
【讨论】:
你好 Biju - 我尝试了update
设置,但是在应用程序运行后数据库仍然是空的。我知道这些值正在被提取,因为如果我将其设置为none
,那么我会收到一个异常,指出客户表不存在。想法?
奇怪,它似乎对我很有效!,我删除了基于 HikariCP 的数据源,并在 application.properties spring.jpa.hibernate.ddl-auto=update spring.datasource.url=jdbc:h2:file:~/db1
中保留了以下条目的默认值,最后我看到了数据库中的条目运行。
嗨 Biju - 抱歉回复晚了。我最终将其设置为none
,通过 Hibernate4 Maven 插件生成架构,并通过 h2 控制台将架构应用于 h2。我现在也有记录。以上是关于Spring Boot JPA 和 H2 记录未持久化的主要内容,如果未能解决你的问题,请参考以下文章
带有 H2 和 data.sql 的 Spring Boot Data JPA - 未找到表
Spring boot jpa H2兼容模式MYSQL不起作用
Spring boot、JPA、Hibernate 和 H2 DB 测试 - 序列不起作用 - 意外的代码路径”;SQL 语句:调用 seq_my_jobs [50000-193] 的下一个值
在spring boot中使用JDBC和spring data jpa为我的会话spring创建单独的数据源