4.5. Tuplizer

org.hibernate.tuple.Tuplizer とそのサブインターフェースは、 表現の org.hibernate.EntityMode に提供されたデータの特定の表現を管理します。 提供されたデータがデータ構造として考慮される場合、 Tuplizer はこのようなデータ構造を作成する方法や、 このようなデータ構造から値を抽出したり挿入する方法を認識します。 例えば、 POJO エンティティモードでは、 対応する Tuplizer はコンストラクタより POJO を作成する方法を認識します。 また、 定義されたプロパティアクセッサを使用して POJO プロパティにアクセスする方法も認識します。
org.hibernate.tuple.entity.EntityTuplizer インターフェースと org.hibernate.tuple.component.ComponentTuplizer インターフェースによって表現される 2 つのハイレベル型の Tuplizer があります。 EntityTuplizer はエンティティに関する前述のコントラクトを管理し、 ComponentTuplizer はコンポーネントに関する前述のコントラクトを管理します。
ユーザーは独自の Tuplizer を使用することもできます。 動的マップのエンティティモードの場合、 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();
        }
    }
}