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获取的,但是我将它设置为createupdate,数据库仍然是空的在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创建单独的数据源

使用 Spring Embedded Database 的 JPA 未找到记录

内存数据库spring-boot中的h2