kis*_*m3t 5 java spring spring-data spring-boot
迁移到 Spring Boot 3.0 后,我们的集成测试表明删除用户无法正常工作。
用户有两个属性,两个属性的定义相同(至少我是这么认为的,见下文)。
我想的是,当我加载 User 对象时,User 的属性之一未加载。仅当我将无法加载的属性定义为 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;
...
}
Run Code Online (Sandbox Code Playgroud)
可加载的用户使用条款
@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;
}
Run Code Online (Sandbox Code Playgroud)
我的设置未加载:
@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;
}
Run Code Online (Sandbox Code Playgroud)
正如您在我的屏幕截图中看到的,当我按 ID 加载实体用户时,它仅显示用户使用条款而不是用户设置

希望有人能指出我正确的方向
更新
我做了一个示例项目来证明它不起作用。一旦NullPonterException我尝试访问UserSettings.
这显然是 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;
}
Run Code Online (Sandbox Code Playgroud)
如果拥有方以某种方式@OneToOne声明相同的 fetchType,Lazy则可以绕过该问题。
所以它适用于
@Entity
public class UserTermsOfUse {
....
@OneToOne(fetch = FetchType.LAZY) // <-------------
private User user;
}
Run Code Online (Sandbox Code Playgroud)
和
@Entity
public class UserSettings {
....
@OneToOne(fetch = FetchType.LAZY) // <-------------
private User user;
}
Run Code Online (Sandbox Code Playgroud)
这确实是hibernate项目的一个bug。它在版本6.1.7.Final和未来版本中得到解决。
| 归档时间: |
|
| 查看次数: |
813 次 |
| 最近记录: |