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;