我有一个带有字段的Hibernate带注释的实体:
@OneToMany(mappedBy="templateInstance", fetch = FetchType.EAGER)
@MapKey(name = "attributeName")
private Map<String, Component> components;
Hibernate使PersistentMap脱颖而出。 然后我想让Dozer将它映射到具有这样一个字段的对象:
private Map<String, ComponentDto> components;
在进行了LazyInitializationExceptions和一些调试之后,我发现,这不是一个封闭的Hibernate会话的问题,但Dozer试图不映射到HashMap而是映射到PersistentMap!因此,当Dozer访问目标映射时,PersistentMap会抛出异常,因为它当然没有会话。
所以,我认为Dozer的意图是映射到HashMap。现在的问题是:我做错了什么还是Dozer,我怎样才能让Dozer将PersistentMap映射到普通的Java标准映射?
之前使用List时我没有遇到任何问题。有没有其他人使用Dozer来映射Hibernate PersistentMap?
此致 Konsumierer
答案 0 :(得分:4)
我自己找到了解决方案。 DTO中的组件字段必须如下所示:
HashMap<String, Component> components = new HashMap<String, Component>;
只有这样才能阻止Dozer使用PersistentMap作为目标对象。
另一个重要的事情是为持有地图的DO使用自定义BeanMappingBuilder,看起来像这样:
public class TemplateInstanceMappingBuilder extends BeanMappingBuilder {
@Override
protected void configure() {
mapping(TemplateInstance.class, TemplateInstanceDto.class)
.fields("components", "components", FieldsMappingOptions.hintB(ComponentDto.class));
}
}
有关该问题的详细信息,请参阅https://sourceforge.net/projects/dozer/forums/forum/452530/topic/4020856/index/page/1
上的推土机论坛