10.12. メタデータの使用

Hibernate は、すべてのエンティティと値型のリッチなメタレベルモデルを必要とします。このモデルはアプリケーション自体で役に立つこともあります。例えば、アプリケーションは、Hibernate のメタデータを使って、「スマートな」ディープコピーアルゴリズムを実装できるかもしません。そのアルゴリズムとは、どオブジェクトがコピーされるべきか(例:可変の値型)やどのオブジェクトはコピーすべきでないか(例:不変な値型や可能なら関連するエンティティ)を判断できるものです。
Hibernate は ClassMetadataCollectionMetadata インタフェースと Type 階層を通してメタデータを公開します。メタデータインターフェースのインスタンスは、 SessionFactory から得ることができます。
Cat fritz = ......;
ClassMetadata catMeta = sessionfactory.getClassMetadata(Cat.class);

Object[] propertyValues = catMeta.getPropertyValues(fritz, EntityMode.POJO);
String[] propertyNames = catMeta.getPropertyNames();
Type[] propertyTypes = catMeta.getPropertyTypes();

// get a Map of all properties which are not collections or associations
Map namedValues = new HashMap();
for ( int i=0; i<propertyNames.length; i++ ) {
    if ( !propertyTypes[i].isEntityType() && !propertyTypes[i].isCollectionType() ) {
        namedValues.put( propertyNames[i], propertyValues[i] );
    }
}