2

我有一个带有字段的 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。现在的问题是:我做错了什么还是推土机,我怎样才能让推土机将 PersistentMap 映射到普通的 Java 标准地图?

我以前使用 List 时没有问题。有没有其他人使用 Dozer 来映射 Hibernate PersistentMap?

问候, Konsumierer

4

1 回答 1

4

我自己找到了解决方案。DTO 中的 components 字段必须如下所示:

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上的推土机论坛

于 2010-12-21T11:11:59.097 回答