迁移到Spring Boot 3.0后,我们的集成测试显示删除用户无法正常工作。
用户有两个属性,这两个属性的定义是相同的(至少我是这么认为的,见下文)。
我想的是,当我加载User对象时,User的一个属性没有被加载。只有当我将无法加载的属性定义为EAGER时,才会加载。如果我现在尝试删除User,这将不起作用,因为在DB中仍然有一个属性引用User。
4.我不知道是什么问题,也许我漏掉了什么
我的用户实体
@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加载实体User时,它只显示User Terms of Use,而不显示User Settings
为了说明清楚,它们位于DB:)
中
希望有人能给我指个方向
- 更新**
我做了一个示例项目来证明它不起作用。一旦我尝试访问NullPonterException
,测试就会失败。
https://github.com/de313e/SpringEagerLoadingIssue
1条答案
按热度按时间0mkxixxg1#
这显然是hib项目的一个bug。
已为其here打开了一个票证,其中包含kism3t问题中描述的错误以及似乎可以绕过该问题的解决方案。
我已经检查了当前不稳定的发布版本的hib
6.2.0
,bug仍然存在。所以可能还没有被检测到。目前,以下解决方法似乎可以绕过此问题
如果
@OneToOne
的拥有方声明了相同的fetchTypeLazy
,则会以某种方式绕过该问题。所以它可以
以及