java 惰性加载不起作用Spring Data 3.0.0休眠-Sping Boot 迁移到3.0后

mxg2im7a  于 2023-02-07  发布在  Java
关注(0)|答案(1)|浏览(131)

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

0mkxixxg

0mkxixxg1#

这显然是hib项目的一个bug。
已为其here打开了一个票证,其中包含kism3t问题中描述的错误以及似乎可以绕过该问题的解决方案。
我已经检查了当前不稳定的发布版本的hib6.2.0,bug仍然存在。所以可能还没有被检测到。
目前,以下解决方法似乎可以绕过此问题

@Entity
   public class User {

      @OneToOne(fetch = FetchType.LAZY, mappedBy = "user") 
      private UserSettings userSettings;

      @OneToOne(fetch = FetchType.LAZY, mappedBy = "user") 
      private UserTermsOfUse userTermsOfUse;
  }

如果@OneToOne的拥有方声明了相同的fetchType Lazy,则会以某种方式绕过该问题。
所以它可以

@Entity
public class UserTermsOfUse {

    ....

    @OneToOne(fetch = FetchType.LAZY)  // <-------------
    private User user;
}

以及

@Entity
public class UserSettings {

    ....

    @OneToOne(fetch = FetchType.LAZY)  // <-------------
    private User user;
}

相关问题