如何在 Mapstruct 中管理延迟加载?

Dor*_*age 9 hibernate lazy-loading java-ee-7 mapstruct

我正在处理与数据库中的延迟加载对象相关的问题。

假设我们有以下实体。

@Entity(name = "User")
@Table(name = "USERS")
public class User{
    @Id
    @GeneratedValue
    private int id

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="NOTES_ID")
    private List<Note> notes;
}
Run Code Online (Sandbox Code Playgroud)

而 Dto 将是

@Mapper
public interface UserDtoMapper{

    /** the INSTACE HERE **/

    User fromDto(UserDto dto);

    UserDto toDto(User user);

}
Run Code Online (Sandbox Code Playgroud)

那么哪个可能是获取所有用户而没有 EJBException 的最佳方法,因为我正在获取他们懒惰?

编辑:解决方案

假设您有以下数据模型

@Entity(name = "User")
@Table(name = "USERS")
public class User{
    @Id
    @GeneratedValue
    private int id

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="NOTES_ID")
    private List<Note> notes;
}
Run Code Online (Sandbox Code Playgroud)
  1. 没有地址的查询,异常:当从模型映射到 DTO 时,它将尝试映射addresses但因为延迟加载(通过休眠或任何其他框架)最终会出现异常。

此外,您可以忽略addressesfrom 被映射,如@Mehmet Bekta?. 但不需要定义source,它是可选的。

@Mapper
public interface UserDtoMapper{

    /** the INSTACE HERE **/

    User fromDto(UserDto dto);

    UserDto toDto(User user);

}
Run Code Online (Sandbox Code Playgroud)
  1. 获取关系:这就是方法。添加一个join来查询addresses,Mapstruct 将完成剩下的工作。

Pet*_*ing 1

您可以使用 Mapstruct 在进行映射时延迟加载所需的所有实体(假设会话仍处于活动状态)。您不需要的已卸载代理可以通过使用忽略注释来忽略。更多详细信息请参见此处。 MapStruct 可以对 Hibernate 实体类进行深度代理吗