Red Hat Training

A Red Hat training course is available for Red Hat JBoss Web Server

5.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();
        }
    }
}