【问题标题】:Hibernate Error executing DDL via JDBC Statement with Postgres使用 Postgres 通过 JDBC 语句执行 DDL 时出现休眠错误
【发布时间】:2020-07-08 08:55:02
【问题描述】:

我的实体有点问题(使用 Spring-boot)。我似乎无法理解可能是什么问题。 hibernate找不到实体之间的关系可能是什么原因?

我在尝试运行应用程序时遇到以下异常

Error executing DDL "alter table order_barcode drop constraint FK16yppq17qkt9vaiw536c468xq" via JDBC Statement
Caused by: org.postgresql.util.PSQLException: ERROR: relation "order_barcode" does not exist
Error executing DDL "alter table "orders" drop constraint FK7nkj808174vaoen3hn8lp39i6" via JDBC Statement
ERROR: relation "orders" does not exist
ERROR: relation "order_ticket" does not exist

实体

@Entity
@Table(name="\"orders\"")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Order {

    public enum OrderStatus {
     
        INITIALIZED("initialized"),
        COMPLETE("complete"),
        FAILED("failed");

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

  
    @NotNull
    @Enumerated(EnumType.STRING)
    private OrderStatus status;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "order_id")
    private Set<OrderTicket> tickets;

    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private OrderPayment payment;
}
@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class OrderBarcode {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id;

    private String barcode;
}

@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class OrderPayment {

    public enum PaymentStatus {
        INITIALIZED("initialized"),
        AUTHORIZED("authorized"),

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id;

    @NotNull
    @Enumerated(EnumType.STRING)
    private PaymentStatus status;
}
@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class OrderTicket {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id;

    private Long templateId;
   
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "ticket_id")
    private Set<OrderBarcode> barcodes;
}

配置

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/test
    username: ${DATABASE_USERNAME}
    password: ${DATABASE_PASSWORD}
    driver-class-name: org.postgresql.Driver
  jpa:
    hibernate:
    database-platform: org.hibernate.dialect.PostgreSQL82Dialect
      ddl-auto: create-drop
      # ddl-auto: update
    properties:
      hibernate:
       connection:
          characterEncoding: utf-8
          CharSet: utf-8
          useUniCode: true
       show-sql: false
        hbm2ddl:
          import_files: sql/import.sql
          import_files_sql_extractor: org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor

【问题讨论】:

    标签: java postgresql spring-boot hibernate spring-data-jpa


    【解决方案1】:

    您可以尝试在每个不存在的表上添加@Table 注释吗?

    @Table(name = "ORDER",schema="xxxxx")
    

    Hibernate 会删除你的 shema,然后在你设置 spring.jpa.hibernate.ddl-auto 时在启动时创建它:create-drop

    【讨论】:

    • 遗憾的是,这并不能解决收到相同错误消息的问题
    • 我还会考虑将您的 lombok DTO 与 Spring 数据 JPA 实体分开。
    • 我现在测试了是否使用 ddl-auto:update 并得到 0 错误:?
    • 这很清楚 - 然后他开始并随后放下它,这意味着它先行,然后不再
    猜你喜欢
    • 2017-08-28
    • 2017-10-20
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 2021-01-08
    • 2020-12-19
    相关资源
    最近更新 更多