【问题标题】:Spring boot + JPA + Hibernate + Oracle does not auto create tables during application start and no errors reported in the logSpring boot + JPA + Hibernate + Oracle 应用启动时不自动建表,日志无报错
【发布时间】:2019-05-29 22:51:19
【问题描述】:

我正在使用 Oracle db 作为数据存储构建 springboot 应用程序。我的应用程序在 h2 inmemory 数据库中运行良好,但一旦我将其定位到 Oracle DB,它就无法按预期工作。表不是在 Oracle DB 中创建的,但我可以看到在应用程序启动期间在控制台上正确打印了 sql 查询。

我尝试了属性 spring.jpa.hibernate.ddl-auto 的所有可能性 并且它们都没有创建任何表。

我正在使用 Springboot + JPA + Hibernate + Oracle 数据库。这里(pom.xml)我已经注​​释掉了h2引用并添加了Oracle JDBC驱动。

<!--  dependency>            
    <groupId>com.h2database</groupId>            
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency-->
<dependency>
    <groupId>com.oracle.jdbc</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>11.2.0.4</version>
</dependency>

我的 application.properties 被修改为包含 url/user/password/driver 信息和方言信息。

spring.jpa.show-sql=true

spring.h2.console.enabled=true

#Using SID
spring.datasource.url= jdbc:oracle:thin:@somehost:1521:test
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver

#hibernate configs
spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
spring.jpa.hibernate.ddl-auto=create

这是一个示例应用程序启动输出 -

[INFO ] 2019-01-03 15:54:19.733 [main] RepositoryConfigurationDelegate - Bootstrapping Spring Data repositories in DEFAULT mode.
[INFO ] 2019-01-03 15:54:19.782 [main] RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 41ms. Found 1 repository interfaces.
[INFO ] 2019-01-03 15:54:20.019 [main] PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$bc3dc584] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[INFO ] 2019-01-03 15:54:20.261 [main] TomcatWebServer - Tomcat initialized with port(s): 8080 (http)
[INFO ] 2019-01-03 15:54:20.364 [main] ContextLoader - Root WebApplicationContext: initialization completed in 1008 ms
[INFO ] 2019-01-03 15:54:20.387 [main] ServletRegistrationBean - Servlet dispatcherServlet mapped to [/]
[INFO ] 2019-01-03 15:54:20.390 [main] FilterRegistrationBean - Mapping filter: 'characterEncodingFilter' to: [/*]
[INFO ] 2019-01-03 15:54:20.390 [main] FilterRegistrationBean - Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
[INFO ] 2019-01-03 15:54:20.390 [main] FilterRegistrationBean - Mapping filter: 'formContentFilter' to: [/*]
[INFO ] 2019-01-03 15:54:20.390 [main] FilterRegistrationBean - Mapping filter: 'requestContextFilter' to: [/*]
Hibernate: drop table request cascade constraints
Hibernate: drop sequence hibernate_sequence
Hibernate: create sequence hibernate_sequence start with 1 increment by  1
Hibernate: create table request (id number(19,0) not null, creation timestamp, modification timestamp, request_data varchar2(32767), request_type varchar2(255 char), service_name varchar2(255), system_name varchar2(255), primary key (id))
[INFO ] 2019-01-03 15:54:28.276 [main] LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default'
[INFO ] 2019-01-03 15:54:28.642 [main] ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
[WARN ] 2019-01-03 15:54:28.670 [main] JpaBaseConfiguration$JpaWebConfiguration$JpaWebMvcConfiguration - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
[INFO ] 2019-01-03 15:54:28.820 [main] TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''

应用程序启动打印 sql 查询,但实际上没有一个在数据库上执行。

【问题讨论】:

    标签: java oracle hibernate spring-boot jpa


    【解决方案1】:

    你应该通过spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect

    比你的spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect

    但是,我对 Oracle DB 不太确定,它在 Mysql 上对我有用。这不应该依赖于底层数据库,IMO。

    有关 Spring Properties 的更多选项,请查看this link.

    【讨论】:

    • 根据您的建议,我将 Dialect 属性名称更改为 spring.jpa.properties.hibernate.dialect 并且仍然没有创建表。
    • 什么是“测试”作为您的网址的最后一部分?请参考此链接,它可能会有所帮助docs.oracle.com/cd/B25329_01/doc/appdev.102/b25320/…
    • 另外,请查看上面 url 页面中的示例 3-1 使用非 XE 客户端安装行指定数据库 URL。另外,请参阅此答案,stackoverflow.com/a/47048336/6446
    • 'test' 是一个数据库 SID。在上面的链接中,示例 3-1 解释了通过数据库服务名称而不是 SID 使用非 XE 客户端进行连接。这个 'dbc:oracle:thin:@somehost:1521:test' url 对于连接到 SID 是正确的。
    【解决方案2】:

    我可以解决这个问题。我直接在oracle db上运行生成的sql,发现列长有问题。我修改了值并构建了我的项目,我可以看到该表已在数据库中创建。

    spring boot 应用程序还有一个问题,表是在应用程序构建期间创建的,而不是在应用程序启动期间创建的。我将在论坛中发布另一个问题以获得有关此问题的帮助 + 我面临的更多问题。

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 1970-01-01
      • 2017-07-02
      • 2022-01-24
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 2017-10-26
      相关资源
      最近更新 更多