[英]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.