Java 春季及;Hibernate:为什么获取1个惰性字段触发器来加载所有其他惰性字段

Java 春季及;Hibernate:为什么获取1个惰性字段触发器来加载所有其他惰性字段,java,spring,hibernate,spring-data-jpa,lazy-loading,Java,Spring,Hibernate,Spring Data Jpa,Lazy Loading,在我的应用程序中,我有一个Staff实体,其中有许多类似这样的延迟加载字段 @Entity(name="CommonStaff") @Table(name="staff") @Getter @Setter public class Staff implements Serializable { ... @ManyToOne(fetch=FetchType.LAZY) @LazyToOne(LazyToOneOption.NO_PROXY) @JoinColumn

在我的应用程序中,我有一个
Staff
实体,其中有许多类似这样的延迟加载字段

@Entity(name="CommonStaff")
@Table(name="staff")
@Getter @Setter
public class Staff implements Serializable {
    ...

    @ManyToOne(fetch=FetchType.LAZY)
    @LazyToOne(LazyToOneOption.NO_PROXY)
    @JoinColumn(name="nationality", referencedColumnName="code", insertable=false, updatable=false)
    private Nationality nationality;

    @ManyToOne(fetch=FetchType.LAZY)
    @LazyToOne(LazyToOneOption.NO_PROXY)
    @JoinColumn(name="marital_status", referencedColumnName="code", insertable=false, updatable=false)
    private MaritalStatus maritalStatus;

    ...
}
当我加载
Staff
记录时,没有一个字段像预期的那样被急切地加载。但是,当我触发时,例如,
getNational()
,我看到框架也在执行SQL来加载
MaritalStatus
。我一直在想办法解决这个问题,但找不到任何有用的资源。如果你能为我指明方向,我将非常感激

一些示例代码

@Autowired
@Qualifier("dataModuleStaffRepo")
private StaffRepo staffRepo;

@CustomerTransactional
@GetMapping("/profile")
public void testProfile(@RequestParam String userId) {
    Optional<Staff> staff = staffRepo.findByUserId(userId);
    if (staff.isPresent()) {
        System.out.println(staff.get().getName());
        System.out.println(staff.get().getNationality().getName());
    }
}

默认情况下,实体类的所有惰性属性都属于名为default的组。获取默认组的任何属性也会获取其他属性。为了解决这个问题,我们需要定义希望使用
@LazyGroup
注释单独获取的组

因此,我们用@LazyGroup注释来注释国籍和婚姻状况,如下所示

@ManyToOne(fetch=FetchType.LAZY)
@LazyToOne(LazyToOneOption.NO_PROXY)
@LazyGroup("nationality")
@JoinColumn(name="nationality", referencedColumnName="code", insertable=false, updatable=false)
private Nationality nationality;

@ManyToOne(fetch=FetchType.LAZY)
@LazyToOne(LazyToOneOption.NO_PROXY)
@LazyGroup("maritalStatus")
@JoinColumn(name="marital_status", referencedColumnName="code", insertable=false, updatable=false)
private MaritalStatus maritalStatus;

希望您正在使用字节码增强来实现无代理延迟抓取

非常感谢您提供的信息。我以前从来不知道这一点:D。我现在将在我的代码中试用它。是的!我正在使用字节码增强,因为我发现这是唯一能让它工作的方法,至少对于一对一的关系来说。。。请纠正我,如果这个说法是错误的:)这是一个很长的故事,当使用:)@Mr.J4mes你可以从hibernate@SternK获得更多的信息我做谷歌和浏览文档不时,但这是一个巨大的文件。有时,我发现很难找到解决这类问题所需的确切细节:D。有时,请有经验的人帮忙。
@ManyToOne(fetch=FetchType.LAZY)
@LazyToOne(LazyToOneOption.NO_PROXY)
@LazyGroup("nationality")
@JoinColumn(name="nationality", referencedColumnName="code", insertable=false, updatable=false)
private Nationality nationality;

@ManyToOne(fetch=FetchType.LAZY)
@LazyToOne(LazyToOneOption.NO_PROXY)
@LazyGroup("maritalStatus")
@JoinColumn(name="marital_status", referencedColumnName="code", insertable=false, updatable=false)
private MaritalStatus maritalStatus;