Dozer:Hibernate PersistentMap未映射到java.util.HashMap

时间:2010-12-20 17:02:53

标签: hibernate hashmap dozer

我有一个带有字段的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

1 个答案:

答案 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

上的推土机论坛