我的 springboot 應用程式中有一對一映射 JPA 表,效果很好。該Users是父表和account_no列,它存盤的外鍵。即,孩子的主鍵。孩子是Account桌子。
但是,當應用程式啟動時,我可以看到user_id在 H2 DB 中創建了一個額外的列 ( )。我認為我的 JPA 映射有問題。請幫助弄清楚。下面是兩個類。
@Entity
public class User extends AbstractEntity {
// Other fields related to user entity go here ..
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "account_no", referencedColumnName = "account_num")
private Account account;
}
@Entity
public class Account extends AbstractEntity{
// fields like account#, balance etc goes here..
@Column(name="account_num", unique = true)
@NotNull
private long accountNo;
@OneToOne (fetch = FetchType.LAZY)
private User user;
}
啟動日志。
create table account (id bigint not null, account_num bigint not null, bal float not null, user_id bigint, primary key (id))
2021-12-22 00:09:28.765 DEBUG 25380 --- [ main] org.hibernate.SQL :
uj5u.com熱心網友回復:
決定哪一側應該包含額外的列并使用該mappedBy屬性。然后 JPA 會做需要的
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false, mappedBy = "user")
private Account account;
考慮到您有雙向映射,您不需要@JoinColumn使用過的。
@OneToOne通過在這些注釋之一上使用mappedBy 屬性,只需注釋和將成為關系所有者物體的決定。
uj5u.com熱心網友回復:
這取決于您將作為外鍵的額外列存盤在哪一側。因為當您開始在兩個表之間建立 oneToOne 關系時,必須將用戶的主鍵存盤在帳戶表中作為外鍵,或帳戶表主鍵在用戶表中作為外鍵。您應該需要宣告mappedBy 和您的表參考名稱。例如,如果您在帳戶表中宣告mappedBy="user" 它將在用戶表中創建一個額外的account_id 列作為外鍵,與for 相同帳戶
@OneToOne(optional = false, mappedBy = "user")
private Account account;
不需要在側邊 OneToOne 注釋中宣告這些東西cascade = CascadeType.ALL, fetch = FetchType.LAZY,默認一直支持lazy fetch
.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/390809.html
