(转)ClassMetadata

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

相关文章
相关标签/搜索