【问题标题】:Spring boot jpa with H2 database带有 H2 数据库的 Spring Boot jpa
【发布时间】:2017-02-20 09:49:50
【问题描述】:

我正在尝试使用 JPA 为 H2 DB 运行我的 Spring Boot 数据项目的示例代码。

代码如下,应用程序运行正常,但我没有看到任何表被创建,我也没有在服务器控制台中看到任何错误。我检查了日志,我没有看到任何被创建的查询被触发。我是不是做错了什么?

领域类:

@Entity
public class Account {

    @Id
    @GeneratedValue
    private Integer accountId;

    private String name;

    private String accType;

    public Integer getAccountId() {
        return accountId;
    }

    public String getName() {
        return name;
    }

    public String getAccType() {
        return accType;
    }

    public Account(Integer accountId, String name, String accType) {
        super();
        this.accountId = accountId;
        this.name = name;
        this.accType = accType;
    }

    public Account(String name, String accType) {
        super();
        this.name = name;
        this.accType = accType;
    }
    public Account() {

    }

数据加载器类:

@Component
public class AccountLoaded {

    private AccountRepository accountRepository;

    public AccountLoaded(AccountRepository accountRepository) {
        this.accountRepository = accountRepository;
    }

    @PostConstruct
    private void loadData() {
        Account account = new Account(1,"Madhu","Savings");
        accountRepository.save(account);
        System.out.println("Loaded Account " + account.toString());
    }

}

存储库类:

@Repository
public interface AccountRepository extends CrudRepository<Account, Integer> {

}

application.properties:

spring.datasource.jdbc-url=jdbc:h2:mem:test
spring.h2.console.enabled=true
spring.h2.console.path=/console
spring.datasource.platform=h2

服务器控制台中的我的日志:

2016-10-11 12:38:26.202  INFO 20020 --- [           main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
2016-10-11 12:38:26.217  INFO 20020 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
    name: default
    ...]
2016-10-11 12:38:26.285  INFO 20020 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.0.11.Final}
2016-10-11 12:38:26.287  INFO 20020 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2016-10-11 12:38:26.288  INFO 20020 --- [           main] org.hibernate.cfg.Environment            : HHH000021: Bytecode provider name : javassist
2016-10-11 12:38:26.327  INFO 20020 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
2016-10-11 12:38:26.554  INFO 20020 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
2016-10-11 12:38:26.995  INFO 20020 --- [           main] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000227: Running hbm2ddl schema export
2016-10-11 12:38:27.004  INFO 20020 --- [           main] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000230: Schema export complete
2016-10-11 12:38:27.044  INFO 20020 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
Loaded Account Account [accountId=1, name=Madhu, accType=Savings]
2016-10-11 12:38:27.587  INFO 20020 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@b472aa: startup date [Tue Oct 11 12:38:23 CDT 2016]; root of context hierarchy
2016-10-11 12:38:27.663  INFO 20020 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2016-10-11 12:38:27.664  INFO 20020 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2016-10-11 12:38:27.696  INFO 20020 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-10-11 12:38:27.696  INFO 20020 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-10-11 12:38:27.732  INFO 20020 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-10-11 12:38:27.959  INFO 20020 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2016-10-11 12:38:28.011  INFO 20020 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2016-10-11 12:38:28.015  INFO 20020 --- [           main] com.example.SpringdataApplication        : Started SpringdataApplication in 4.898 seconds (JVM running for 5.255)

【问题讨论】:

  • 一切就绪:HHH000227: Running hbm2ddl schema exportHHH000230: Schema export complete
  • H2 是一个内存数据库。您在磁盘上看不到任何数据。
  • @Heri H2 可以在内存中或磁盘上使用,具体取决于配置。

标签: java spring jpa spring-boot h2


【解决方案1】:

即使所有操作都在内存中完成,当 spring.jpa.show-sql 设置为 true(在 application.properties 文件中)时,您应该会看到 SQL 日志。

不要忘记将spring.jpa.generate-ddl 设置为true(默认为false)并使您的loadData 方法事务(参见Spring @Transactional 注释)。

【讨论】:

    【解决方案2】:

    如果您转到嵌入式 h2 控制台 (http://localhost:8080/console),并输入正确的连接 URL (jdbc:h2:mem:test),您应该会看到。

    默认情况下,嵌入式 h2 控制台不显示正确的连接 URL,它忘记了 :mem: 部分 IIRC。

    【讨论】:

      【解决方案3】:

      spring.datasource.jdbc-url=jdbc:h2:mem:test 更改为spring.datasource.jdbc-url=jdbc:h2:file:test(test 是db 文件的名称,也可以有一个带有名称的路径)并使用these tools 之一来查看数据库。

      您还可以将 SQL 语句记录到控制台,方法是将 spring.jpa.show-sql: true 添加到您的 application.properties

      【讨论】:

      • 不需要额外的工具,他已经有了h2控制台(spring.h2.console.enabled=true, spring.h2.console.path=/console)
      猜你喜欢
      • 2021-02-25
      • 2014-08-27
      • 1970-01-01
      • 2021-08-17
      • 2019-09-06
      • 2016-07-25
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      相关资源
      最近更新 更多