我有两个实体,ManyToOne Relationship和Lazy Fetch类型:

@Entity
public class Item {
 private Long id;
 private String title;

 @ManyToOne(fetch = FetchType.LAZY)
 private Category category;
}

@Entity
public class Category {
 private Long id;
 private String title;
}

我有DTO:

public class ItemDTO {
 private Long id;
 private String title;

 private Long categoryId;
}

当我从数据库获取项目时,我使用mapstruct将它们映射到ItemDTO,其中我有以下规则:

@Mapping(source = "category.id", target = "categoryId")
ItemDTO itemToItemDTO(Item item);

而且一切都运行得很完美,但问题是mapstruct在其impl类中如何以及在哪里获得有关惰性获取的类别的数据?

我有过

show-sql: true 

在属性中,在映射发生时看不到任何其他查询.有人能给我解释一下它是怎么工作的吗?

推荐答案

如我所见,您使用MapStruct将Item实体的category.id字段映射到ItemDTOcategoryId字段.

通过这种方式,MapStruct将生成一个映射方法,该方法将判断category字段是否已初始化.如果此字段未初始化,MapStruct将在调用category.getId()方法之前对其进行初始化.

它是使用一种称为bytecode enhancement的技术来实现的.MapStruct将bytecode enhancer注入到编译过程中,这将修改生成的代码以在访问lazy-fetched个字段之前对其进行初始化.

在初始化CATEGORY字段后,MapStruct通过调用category.getId()方法来获取有关延迟获取的类别的数据.

Java相关问答推荐

int Array Stream System. out. print方法在打印Java8时在末尾添加% sign

scanner 如何在执行hasNextLine一次后重新读取整个文件?

Java List with all combinations of 8 booleans

Apache POI:使用反射获取zoom 级别

springboot start loge change

如何在带有Micronaut的YAML中使用包含特殊字符的字符串作为键

Jolt变换JSON数组问题

使用存储在字符串变量中的路径目录打开.pdf文件

Instancio未在日志(log)中显示测试失败消息

垃圾收集时间长,会丢弃网络连接,但不会在Kubernetes中反弹Pod

为什么StandardOpenOption.CREATE不能通过Ubuntu在中小企业上运行?

错误:不兼容的类型:Double不能转换为Float

如何在Record Java中使用isRecord()和RecordComponent[]?

获取所有可以处理Invent.ACTION_MEDIA_BUTTON Android 13 API33的Android包

Java 17与Java 8双重表示法

H2数据库仅支持%1个结果集?

无法在Java中获取ElastiCache的AWS CloudWatch指标

HBox内部的左对齐按钮(如果重要的话,在页码内)

spring 更新多项管理关系

设置背景时缺少Android编辑文本下划线