Hibernate的元數據
Hibernate中有一個很是豐富的元數據模型,含有全部的實體和值類型數據的元數據。
Hibernate提供了ClassMetadata接口、CollectionMetadata接口和Type層次體系來訪問元數據。能夠經過SessionFactory獲取元數據接口的實例。
ClassMetadata catMeta = sessionfactory.getClassMetadata(Cat.class);
Object[] propertyValues = catMeta.getPropertyValues(fritz);
String[] propertyNames = catMeta.getPropertyNames();
Type[] propertyTypes = catMeta.getPropertyTypes();
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]);
}
}
經過將持久化對象的類做爲參數調用SessionFactory的getClassMetadata方法就能夠獲得關於此對象的全部元數據信息的接口ClassMetadata。下面是ClassMetadata接口的主要方法說明。
l public String getEntityName():獲取實體名稱。
l public String getIdentifierPropertyName():獲得主鍵的名稱。
l public String[] getPropertyNames():獲得全部屬性名稱(不包括主鍵)。
l public Type getIdentifierType():獲得主鍵的類型。
l public Type[] getPropertyTypes():獲得全部屬性的類型(不包括主鍵)。
l public Type getPropertyType(String propertyName):獲得指定屬性的類型。
l public boolean isVersioned():實體是不是版本化的。
l public int getVersionProperty():獲得版本屬性。
l public boolean[] getPropertyNullability():獲得全部屬性的「是否容許爲空」屬性。
l public boolean[] getPropertyLaziness():獲得全部屬性的「是否LazyLoad」屬性。
l public boolean hasIdentifierProperty():實體是否有主鍵字段。
l public boolean hasSubclasses():是否有子類。
l public boolean isInherited():是不是子類。
ClassMetadata 接口有getPropertyTypes()、getPropertyNullability()這樣平面化的訪問全部字段屬性的方法,這些方法是供 Hibernate內部實現用的,在外部使用的時候咱們經常須要深刻每一個屬性的內部,這樣藉助於getPropertyNames()、 getPropertyType(String propertyName)兩個方法就能夠知足要求了。
ClassMetadata entityMetaInfo = sessionFactory
.getClassMetadata(destClass);
String[] propertyNames = entityMetaInfo.getPropertyNames();
for (int i = 0, n = propertyNames.length; i < n; i++)
{
String propertyName = propertyNames[i];
Type propType = entityMetaInfo.getPropertyType(propertyName);
…
}
getPropertyType(String propertyName)方法返回的類型爲Type,這個類型包含了字段的元數據信息. html
Hibernate中的集合類型的基類是 CollectionType,其子類分別對應着數組類型(ArrayType)、Bag類型(BagType)、List類型(ListType)、 Map類型(MapType)、Set類型(SetType)。而「多對一」和「一對一」類型分別爲ManyToOneType和 OneToOneType,它們的基類爲EntityType。BigDecimal、Boolean、String、Date等類型則屬於 NullableType的直接或者間接子類。
Type接口的主要方法列舉以下。
l public boolean isAssociationType():此類型是否能夠轉型爲AssociationType,並不表示此屬性是關聯屬性。
l public boolean isCollectionType():是不是集合類型。
l public boolean isComponentType():是不是Component類型,若是是的話必須能轉型爲AbstractComponentType類型。
l public boolean isEntityType():是不是實體類型。
l public boolean isAnyType():是不是Any類型。
l public int[] sqlTypes(Mapping mapping):取得實體各個字段的SQL類型,返回值的類型遵照java.sql.Types中的定義。
l public Class getReturnedClass():返回值類型。
l public String getName():返回類型名稱。
java
轉自:http://blog.sina.com.cn/s/blog_4f38007f01017ib7.html sql