4.5. Tuplizer

4.5. Tuplizer

org.hibernate.tuple.Tuplizer とそのサブインターフェースは、表現の org.hibernate.EntityMode を利用して、データ断片のある表現の管理に責任を持ちます。与えられたデータ断片をデータ構造として考えるなら、 Tuplizer はそのようなデータ構造をどのように作成するかを知り、そのようなデータ構造からどのように値を抽出し、注入するかを知っています。例えば POJO エンティティモードでは、対応する Tuplizer はコンストラクタを通して、 POJO をどのように作成するか、定義されたプロパティアクセサを使い、 POJO プロパティにどのようにアクセスするかを知ります。 Tuplizer には二つのハイレベルの型があります。それらは、org.hibernate.tuple.entity.EntityTuplizerorg.hibernate.tuple.component.ComponentTuplizer インターフェースで表現されます。 EntityTuplizer は上で述べたようなエンティティに関する契約の管理に責任を持ちます。一方、 ComponentTuplizer はコンポーネントに関する契約の管理に責任を持ちます。

ユーザーは独自の Tuplizer に差し替えることも可能です。おそらく dynamic-map entity-mode の際に java.util.HashMap を使うのではなく、 java.util.Map の実装が必要でしょう。もしくは、おそらくデフォルトのものではなく、別のプロキシ生成戦略の定義が必要でしょう。両者とも、カスタムの Tuplizer 実装を定義することで達成されます。 Tuplizer の定義は、管理しようとするエンティティやコンポーネントのマッピングに結び付けられます。顧客エンティティの例は以下になります:

<hibernate-mapping>
    <class entity-name="Customer">
        <!--
            Override the dynamic-map entity-mode
            tuplizer for the customer entity
        -->
        <tuplizer entity-mode="dynamic-map"
                class="CustomMapTuplizerImpl"/>

        <id name="id" type="long" column="ID">
            <generator class="sequence"/>
        </id>

        <!-- other properties -->
        ...
    </class>
</hibernate-mapping>


public class CustomMapTuplizerImpl
        extends org.hibernate.tuple.entity.DynamicMapEntityTuplizer {
    // override the buildInstantiator() method to plug in our custom map...
    protected final Instantiator buildInstantiator(
            org.hibernate.mapping.PersistentClass mappingInfo) {
        return new CustomMapInstantiator( mappingInfo );
    }

    private static final class CustomMapInstantiator
            extends org.hibernate.tuple.DynamicMapInstantitor {
        // override the generateMap() method to return our custom map...
    protected final Map generateMap() {
    return new CustomMap();
    }
    }
}