我正在努力解決我一直試圖解決的以下問題。在檢查了 StackOverflow 上的解決方案和 Baeldung 上的文章之后,當我嘗試在 SpringBoot 應用程式中映射具有復合 PK 的 2 個 Oracle SQL 表之間的以下一對一關系時,我仍然遇到不同的 JPA 錯誤:
掌握
| ID | 版本 |
|---|---|
| 1個 | 2022.1 |
約束:
PK_MASTER PRIMARY KEY(ID, VERSION)
主要細節
| MASTER_ID | 版本 | 細節 |
|---|---|---|
| 1個 | 2022.1 | 細節 |
約束:
PK_MASTER_DETAILS PRIMARY KEY(MASTER_ID, VERSION)
FK_MASTER_DETAILS FOREIGN KEY(MASTER_ID, VERSION) REFERENCES MASTER(ID, VERSION)
在嘗試使用 @OneToOne JPA 批注映射它并在復合 PK 上設定了 @EmbeddedId 的兩個類時遇到一些失敗后,我還安裝了JPA Buddy以檢查它將如何生成并導致以下 4 個類:
大師.java
@Getter
@Setter
@Entity
@Table(name = "master")
public class Master {
@EmbeddedId
private MasterId id;
@OneToOne(mappedBy = "master")
private MasterDetails masterDetails;
}
MasterId.java
@Getter
@Setter
@Embeddable
public class MasterId implements Serializable {
private static final long serialVersionUID = 8254837075462858051L;
@Column(name = "id", nullable = false)
private BigDecimal id;
@Lob
@Column(name = "version", nullable = false)
private String version;
}
MasterDetails.java
@Getter
@Setter
@Entity
@Table(name = "master_details")
public class MasterDetails {
@EmbeddedId
private MasterDetailsId id;
@MapsId
@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumns({
@JoinColumn(name = "master_id", referencedColumnName = "id", nullable = false),
@JoinColumn(name = "version", referencedColumnName = "version", nullable = false)
})
private Master master;
@Lob
@Column(name = "details", nullable = false)
private String details;
}
MasterDetailsId.java
@Getter
@Setter
@Embeddable
public class MasterDetailsId implements Serializable {
private static final long serialVersionUID = -8375336118866998644L;
@Column(name = "master_id", nullable = false)
private BigDecimal masterId;
@Lob
@Column(name = "version", nullable = false)
private String version;
}
使用此 JPA 結構運行 SpringBoot 應用程式時收到的運行時錯誤是:
org.hibernate.PropertyNotFoundException: Could not locate field [id] on class [org.project.packages.MasterDetails]
洗掉導致此錯誤的 @MapsId 后,應用程式啟動,但在嘗試向表中插入資料時出現以下錯誤:
org.hibernate.id.IdentifierGenerationException: null id generated for:class org.project.packages.MasterDetails
檢查 H2 測驗資料庫我注意到 Master_Details 表上的 FK 不存在,但只設定了 PK。
對于指出如何解決此問題的任何幫助,我將不勝感激:需要其他注釋(Cascade/FetchType),或者如果要對資料庫級別進行任何更改(我還嘗試在 Master_Details 表中添加一個單獨的識別符號列定義為 PK,只保留 FK 到 Master 表)。提前致謝!
uj5u.com熱心網友回復:
經過多次嘗試,我想出了解決問題的辦法。
我必須在兩個物體和 FetchType.LAZY 之間使用公共密鑰。
MasterDetails.class
public class MasterDetails {
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="ID", column=@Column(name="MASTER_ID"))
})
private MasterId id;
@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumns({
@JoinColumn(name = "master_id", referencedColumnName = "id", nullable = false),
@JoinColumn(name = "version", referencedColumnName = "version", nullable = false)
})
private Master master;
@Lob
@Column(name = "guidance", nullable = false)
private String guidance;
}
碩士課
public class MasterSheet {
@EmbeddedId
private MasterId id;
@OneToOne(mappedBy = "master", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private MasterDetails masterDetails;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/534292.html
