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 にマップすることだと思いました。ここで質問です: 私は何か間違ったことをしていますか、それとも Dozer ですか? Dozer に PersistentMap を通常の Java 標準マップにマップさせるにはどうすればよいですか?

以前はリストを使用しても問題はありませんでした。Hibernate PersistentMap のマッピングに Dozer を使用した人はいますか?

よろしく、 コンスミエラー

4

1 に答える 1

4

私は自分で解決策を見つけました。DTO の components フィールドは次のようになっている必要があります。

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

この方法でのみ、Dozer が PersistentMap をターゲット オブジェクトとして使用するのを防ぐことができます。

もう 1 つの重要な点は、次のようなマップを保持する 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 の Dozer フォーラムを参照してください。

于 2010-12-21T11:11:59.097 に答える