我必須使用 Spring 和 Postgres 創建一個簡單的應用程式。我有一些物體有關系,例如作業、公司、編程語言。Job 物體與 Company 具有 @ManyToOne 關系,與 ProgrammingLanguage 具有 @OneToMany 關系。我需要將這三個物體中的每一個都保存在 DB 的相應表中,尤其是 Job。在創建物件 Company 和 ProgrammingLanguage 后,我使用它們的存盤庫將它們保存到 DB 中,一切都很好。然后我將這些物件設定為 Job 物體的屬性并保持它。我運行我的應用程式,對于串列中的第一個和第二個作業,我必須堅持一切正常,它們被添加到資料庫中。但是當涉及到第三個作業時,應用程式崩潰并顯示錯誤訊息:
2022-02-24 13:56:00.838 WARN 8364 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 23505
2022-02-24 13:56:00.839 ERROR 8364 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : ERROR: duplicate key value violates unique constraint "uk_gi5d5wf8tux7hmiwtk9nhql9k"
Detail: Key (programming_languages_id)=(30) already exists.
此外,我打開了除錯器并列印了有關每個 ProgrammingLanguage 的詳細資訊,并且每次應用程式在 ProgrammingLanguage 記錄的 id=30 處停止時。 這是來自 Netbeans 的帶有輸出控制臺的影像
用于創建和持久化物體的代碼是這樣的:
有誰知道這個重復的 id 在 ProgrammingLanguage 物體中來自哪里?它不應該是處理物體ID的序列嗎?
uj5u.com熱心網友回復:
我相信,您的問題是您的資料庫中存在兩次 ID 為 30 的編程語言物體,不是嗎?
uj5u.com熱心網友回復:
您能否向我們展示 ProgrammingLanguage 的物體類以及您是如何插入資料庫的?
uj5u.com熱心網友回復:
你需要研究一下持久性并了解它是如何作業的。需要小心地持久化相關聯的物體。作為您的問題的提示 - 您應該只保存最頂層的物體,這將保存所有相關的子物體。您收到的錯誤是因為編程語言物體已經保存(您手動保存),并且它也被保存為父物體的一部分(作為您的第三份作業的一部分)
uj5u.com熱心網友回復:
我設法找出導致我所描述的影響的問題的根源。這是由于 Spring 在創建 Job 和 ProgrammingLanguage 之間的鏈接表時做出的約束,其中存盤了 2 條記錄的 ID,在 Postgres 資料庫中稱為 Job_Programming_Language 的表。此約束具有以下代碼:
-- Constraint: uk_gi5d5wf8tux7hmiwtk9nhql9k
-- ALTER TABLE IF EXISTS public.job_entity_programming_languages DROP CONSTRAINT IF EXISTS uk_gi5d5wf8tux7hmiwtk9nhql9k;
ALTER TABLE IF EXISTS public.job_entity_programming_languages
ADD CONSTRAINT uk_gi5d5wf8tux7hmiwtk9nhql9k UNIQUE (programming_languages_id);
我現在的問題是如何擺脫這個約束,它將那個愚蠢的單一性強加在那個連接創建的表上的 ProgrammingLanguage Ids 上?或者我該如何改變它?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/431832.html
標籤:爪哇 春天 PostgreSQL
