【问题标题】:Hibernate JPA Spring Boot休眠 JPA 春季启动
【发布时间】:2020-05-17 10:59:34
【问题描述】:

我已经为我的 Spring Boot 应用程序创建了所有模型,并根据业务逻辑成功地指定了它们之间的关系。在我的属性文件中,我将 hibernate auto-ddl 选项设置为 create 以根据实体之间的关系生成所有表。我也在使用 liquibase 进行数据库迁移。

问题是,从日志中我可以看到 hibernate 在创建表之前正在更改它,因此抛出运行时异常,说“找不到表”。为什么它在创建之前更改表?如何解决这个问题?

任何帮助都将不胜感激。提前致谢。

一些日志示例

Error executing DDL "alter table application drop foreign key FKrtuepaxepo3o6x0pkn0w62ucg" via JDBC Statement.

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "APPLICATION" not found; SQL statement:
alter table application drop foreign key FKrtuepaxepo3o6x0pkn0w62ucg

.......
.......
.......
Hibernate: drop table if exists application
create table application (id bigint not null auto_increment
alter table application add constraint UK_5jl5nuoh207t0japuutb4avd4 unique (application_name)

为什么在创建“应用程序”之前需要表名作为“应用程序”

@Table(name = "application")
    @EqualsAndHashCode(onlyExplicitlyIncluded = true)
    public class Application extends AbstractAuditingEntity implements Serializable {

        private static final long serialVersionUID = 1L;
}

我在开发中使用 H2 数据库,在生产中使用 MYSQL。但是,以前,我在“application-dev.yml”中使用“org.hibernate.dialect.MySQL5InnoDBDialect”方言。将其更改为 h2 dialect(org.hibernate.dialect.H2Dialect) 解决了问题。

但是,application-prod.yml 中的正确方言应该是什么?我在生产中使用 MYSQL。我在这里使用的当前方言是“org.hibernate.dialect.MySQL5InnoDBDialect”。这将进一步在生产中产生问题。

application-prod.yml

datasource:
#    type: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/appscoredb
    username:
    password:
    hikari:
      poolName: Hikari
      auto-commit: false
#  h2:
#    console:
#        enabled: true
#        settings:
#          web-allow-others: true
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    database: mysql
    hibernate:
      ddl-auto: none

    show-sql: true
    properties:
      hibernate.id.new_generator_mappings: true
      hibernate.connection.provider_disables_autocommit: true
      hibernate.cache.use_second_level_cache: false
      hibernate.cache.use_query_cache: false
      hibernate.generate_statistics: false
  liquibase:
    # Remove 'faker' if you do not want the sample data to be loaded automatically
    contexts: prod, faker
    enabled: false

【问题讨论】:

  • 它说找不到表应用程序。您还可以包含您的属性文件吗?另外,请将您的代码sn-ps分成相应的块,不清楚是只有日志,您的类和日志还是什么的......
  • @Giorgi Tsiklaur - 我已经编辑了这个问题。请看一看。
  • 试试 ddl-auto: update
  • 感谢它有效.. 对于上述生产方言,ddl-auto: update 有效。现在它不会在创建表之前更改表。但是,对于 ddl-auto: create,它会在创建之前更改表。你能解释一下为什么吗?这里的概念是什么?
  • 我不推荐使用 Hibernate 在生产环境中更改表。最好在生产中坚持“更新”。在较低的环境中,您可以使用 create-drop 和 create。

标签: spring hibernate spring-boot jpa


【解决方案1】:

用这个方言解决:org.hibernate.dialect.MySQL5Dialect

我希望它可以在不久的将来帮助某人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2018-04-25
    • 2020-10-21
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2018-01-23
    相关资源
    最近更新 更多