java - 使用 Postgres 通过 JDBC 语句执行 DDL 时出现休眠错误
问题描述
我的实体有点麻烦(使用 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
解决方案
您可以尝试在每个不存在的表上添加@Table 注释吗?
@Table(name = "ORDER",schema="xxxxx")
Hibernate 将删除您的 shema,然后在您设置 spring.jpa.hibernate.ddl-auto 时在启动时创建它: create-drop
推荐阅读
- c - 在只编写一个免费功能的情况下获得双重免费
- javascript - 如何在 Object 中搜索在数组中也有值的值?
- c++ - std 或 boost 是否有标签
或 type_t 某处? - android - 有没有办法只通过扫描二维码而不打开任何浏览器来打开安卓应用程序?
- c++ - 使用线程时的 GUI 滞后问题
- mysql - 如何比较来自不同表的两列并在mysql中区分?
- javascript - 如何使用moment.js获取给定范围内每个月的特殊日期列表
- mysql - Mysql用空表返回一些用户选择的值
- python - 如何将 Python 的变量传递给同一 Python 程序中的 bash 代码?
- laravel - laravel 虚拟主机设置未显示前端