10.12. メタデータの使用
Hibernate は、すべてのエンティティと値型のリッチなメタレベルモデルを必要とします。このモデルはアプリケーション自体で役に立つこともあります。例えば、アプリケーションは、Hibernate のメタデータを使って、「スマートな」ディープコピーアルゴリズムを実装できるかもしません。そのアルゴリズムとは、どオブジェクトがコピーされるべきか(例:可変の値型)やどのオブジェクトはコピーすべきでないか(例:不変な値型や可能なら関連するエンティティ)を判断できるものです。
Hibernate は
ClassMetadata
と CollectionMetadata
インタフェースと 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] ); } }