[英]LAZY Loading not working Spring Data 3.0.0 Hibernate - After Spring Boot Migration to 3.0
遷移到 Spring Boot 3.0 后,我們的集成測試表明刪除用戶無法正常工作。
User 有兩個屬性,兩者的定義相同(至少我是這么認為的,見下文)。
我想的是,當我加載用戶 object 時,未加載用戶的屬性之一。 僅當我將無法加載的屬性定義為 EAGER 時。 如果我現在嘗試刪除用戶,這將不起作用,因為數據庫中仍然有一個引用用戶的屬性。
我不知道是什么問題,也許我遺漏了什么
我的用戶實體
@Entity
@Data
@Table(name = "user_model")
public class User extends BaseEntity {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id;
...
@OneToOne(fetch = FetchType.LAZY, mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private UserSettings userSettings;
@OneToOne(fetch = FetchType.LAZY, mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private UserTermsOfUse userTermsOfUse;
...
}
可以加載的用戶使用條款
@Entity
@Table(name = "user_termsofuse")
@Data
public class UserTermsOfUse extends BaseEntity {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id;
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "user_id", referencedColumnName = "id")
@ToString.Exclude
private User user;
@Column(name = "accepted_termsofuse")
private String acceptedTermsOfUse;
}
我的設置不加載:
@Entity
@Table(name = "user_settings")
@Data
public class UserSettings extends BaseEntity {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id;
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "user_id", referencedColumnName = "id")
@ToString.Exclude
private User user;
private String language;
private String lastActiveClientId;
}
正如您在我的屏幕截圖中所見,當我按 ID 加載實體用戶時,它僅顯示用戶使用條款 ant 而不是用戶設置
希望有人能指出我正確的方向
更新
我做了一個示例項目來證明它不起作用。 一旦我嘗試訪問UserSettings
,測試就會失敗並出現NullPonterException
。
這顯然是 hibernate 項目的錯誤。
在kism3t的問題中描述的錯誤以及似乎是繞過該問題的解決方法的問題都在這里打開了一張票。
檢查了 hibernate 6.2.0
的當前非穩定發布版本,錯誤仍然存在。 所以可能還沒有被發現。
目前,以下解決方法似乎可以繞過該問題
@Entity
public class User {
@OneToOne(fetch = FetchType.LAZY, mappedBy = "user")
private UserSettings userSettings;
@OneToOne(fetch = FetchType.LAZY, mappedBy = "user")
private UserTermsOfUse userTermsOfUse;
}
如果@OneToOne
的擁有方聲明了相同的Lazy
fetchType,則該問題會以某種方式被繞過。
所以它適用於
@Entity
public class UserTermsOfUse {
....
@OneToOne(fetch = FetchType.LAZY) // <-------------
private User user;
}
和
@Entity
public class UserSettings {
....
@OneToOne(fetch = FetchType.LAZY) // <-------------
private User user;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.