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

问题描述 投票:0回答:1

迁移到 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

https://github.com/de313e/SpringEagerLoadingIssue

java spring spring-boot spring-data
1个回答
2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.