LAZY 加载不起作用 Spring Data 3.0.0 Hibernate - Spring Boot 迁移到 3.0 后

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.

https://github.com/de313e/SpringEagerLoadingIssue

Pan*_*kos 2

这显然是 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和未来版本中得到解决。