迁移到 Spring Boot 3.0 后,我们的集成测试表明删除用户无法正常工作。
用户有两个属性,两者定义相同(至少我是这么认为的,见下文)。
我想的是,当我加载用户对象时,用户的一个属性没有加载。仅当我将无法加载的属性定义为 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 加载实体用户时,它仅显示用户使用条款而不是用户设置
希望有人能给我指出正确的方向
更新
我做了一个示例项目来证明它不起作用。一旦我尝试访问
NullPonterException
.,测试将失败并显示
UserSettings
这显然是 hibernate 项目的一个错误。
已经为它开了一张票here既有来自kism3t的问题中描述的错误,也有似乎是绕过这个问题的解决方法。
检查了当前非稳定发布的休眠版本
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;
}
这确实是hibernate项目的一个bug。它在版本 6.1.7.Final 和未来版本中得到解决。