Dozer: Hibernate PersistentMap не сопоставлен с java.util.HashMap - PullRequest
2 голосов
/ 20 декабря 2010

У меня есть аннотированный объект Hibernate с полем:

@OneToMany(mappedBy="templateInstance", fetch = FetchType.EAGER) 
@MapKey(name = "attributeName") 
private Map<String, Component> components; 

Hibernate делает PersistentMap из этого. Затем я хочу, чтобы Dozer отобразил это на объект с таким полем:

private Map<String, ComponentDto> components; 

После появления исключений LazyInitializationException и некоторой отладки я обнаружил, что проблема не в закрытом сеансе Hibernate, а в том, что Dozer пытается сопоставить не HashMap, а PersistentMap! И поэтому, когда Dozer получает доступ к целевой карте, PersistentMap выдает исключение, потому что у него, конечно, нет сеанса.

Итак, я подумал, что намерением Dozer является сопоставление с HashMap. Теперь вопрос: я делаю что-то не так или Dozer и как я могу заставить Dozer сопоставить PersistentMap с обычной стандартной картой Java?

У меня не было проблем при использовании списка раньше. Кто-нибудь еще использовал Dozer для отображения Hibernate PersistentMap?

С уважением, Konsumierer

1 Ответ

4 голосов
/ 21 декабря 2010

Я нашел решение сам. Поле компонентов в DTO должно выглядеть так:

HashMap<String, Component> components = new HashMap<String, Component>;

Только так вы можете запретить Dozer использовать PersistentMap в качестве целевого объекта.

И еще одна важная вещь - использовать пользовательский BeanMappingBuilder для DO, который содержит карту и выглядит так:

public class TemplateInstanceMappingBuilder extends BeanMappingBuilder {

    @Override
    protected void configure() {

        mapping(TemplateInstance.class, TemplateInstanceDto.class)
            .fields("components", "components", FieldsMappingOptions.hintB(ComponentDto.class));

    }
}

Дополнительную информацию об этой проблеме см. На форумах Dozer по адресу https://sourceforge.net/projects/dozer/forums/forum/452530/topic/4020856/index/page/1

.
...