9

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

假设我们有以下实体。

@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;
}

Dto 将是

@Mapper
public interface UserDtoMapper{

    /** the INSTACE HERE **/

    User fromDto(UserDto dto);

    UserDto toDto(User user);

}

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

编辑:解决方案

假设您有以下数据模型

public class User{

    private String name;

    //... other fields

    @OneToMany
    private Set<Address> addresses;
}
  1. 无地址查询,异常:当从模型映射到 DTO 时,它会尝试映射addresses,但因为延迟加载(通过休眠或任何其他框架)最终会出现异常。

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

@Mapping(target = "addresses", ignore = true)
  1. 获取关系:就是这样。添加一个join来查询addresses和 Mapstruct 将完成其余的工作。
4

2 回答 2

1

您可以使用忽略选项。

 @Mapping(source = "user.id", target = "userId", ignore = true)

但是通过这种方式,您无法映射像 Eager fetch 类型这样的关系字段。

于 2019-08-08T05:48:09.243 回答
0

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

于 2017-02-10T22:03:44.730 回答