我正在為 Spring Boot 中的集成測驗運行嵌入式 postgres 資料庫。
這個想法是禁用 liquibase 進行集成測驗,因為它填充了許多不必要的資料以在我們的專案中進行測驗。啟用 liquibase 后,測驗有效,但我嘗試了這種方法:
spring:
liquibase:
enabled: false
jpa:
hibernate:
ddl-auto: create-drop
show-sql: true
Hibernate 會創建關系,但如果您將關系的一端留空,它們就會失敗。
這是我得到的錯誤:
ERROR: insert or update on table "faq" violates foreign key constraint "fkponmkmbropnkmq3y1juw9v44"
Detail: Key (id)=(1) is not present in table "faq_subcategory".
這是 Faq 物體中的關系:
@ManyToOne(optional = true, fetch = FetchType.LAZY)
@JoinColumn(name = "subcategory_id", nullable = true)
@JsonIgnore
private FAQSubcategory faqSubcategory;
這是 FaqSubcategory 物體中的關系:
@OneToMany(mappedBy = "id", fetch = FetchType.LAZY, orphanRemoval = false)
private List<Faq> faqs;
optional = true并且nullable = true是多余的,但我把它放在那里以防萬一但仍然得到同樣的錯誤。我不確定我錯過了什么。
一個子類別可以有許多常見問題解答,每個常見問題解答可以屬于一個子類別,但它不需要。如果我INSERT直接在 postgres 資料庫上使用 subcategory_id = null運行陳述句,它不會抱怨。
有什么想法嗎?
謝謝。
編輯1:
按照@Gleb Yan 的建議,我比較了兩種模式。
當我用 liquibase 創建它時,DDL 是:
CREATE TABLE public.faq (
id int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
creation_date timestamp(6) NULL,
creator_id varchar(255) NULL,
modification_date timestamp(6) NULL,
modifier_id varchar(255) NULL,
"name" varchar(255) NULL,
order_int int4 NULL,
active bool NULL,
subcategory_id int8 NULL,
CONSTRAINT faq_pkey PRIMARY KEY (id),
CONSTRAINT fk_faq_faq__subcategory FOREIGN KEY (subcategory_id) REFERENCES public.faq_subcategory(id)
);
但hibernate.ddl-auto=create-drop它會創建兩個外鍵:
CREATE TABLE public.faq (
id bigserial NOT NULL,
creation_date timestamp NULL,
creator_id varchar(255) NULL,
modification_date timestamp NULL,
modifier_id varchar(255) NULL,
active bool NULL,
"name" varchar(255) NULL,
order_int int4 NULL,
subcategory_id int8 NULL,
CONSTRAINT faq_pkey null,
CONSTRAINT fkoqpq35oftfpexvtkutja0p4ab FOREIGN KEY (subcategory_id) REFERENCES public.faq_subcategory(id),
CONSTRAINT fkponmkmbropnkmq3y1juw9v44 FOREIGN KEY (id) REFERENCES public.faq_subcategory(id)
);
為什么休眠會這樣做?
編輯2:
我已經嘗試將注釋更改為:
@ManyToOne(targetEntity = FAQSubcategory.class)
@JsonIgnore
private FAQSubcategory faqSubcategory;
@OneToMany(targetEntity = FAQ.class, fetch = FetchType.LAZY)
private List<FAQ> faqs;
現在休眠只用 1 個外鍵正確地執行 DDL,但是如果我再次打開 liquibase,它就不起作用了。
Caused by: org.postgresql.util.PSQLException: ERROR: column "faq_subcategory_id" of relation "faq" does not exist
我無法理解它。
uj5u.com熱心網友回復:
終于找到了。我將子類別映射為 faq 的 id 而不是 subcategoryId 欄位。
以前的:
@OneToMany(mappedBy = "id", fetch = FetchType.LAZY, orphanRemoval = false)
private List<Faq> faqs;
作業一:
@OneToMany(mappedBy = "faqSubcategory", fetch = FetchType.LAZY)
private List<FAQOKHelp> faqs;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/414191.html
標籤:
下一篇:如何修復無法延遲初始化集合
