`

Hibernate的元数据(不需要java类,动态建表,存储,读取)

 
阅读更多
http://blog.csdn.net/fengxinyixiao/article/details/11684521
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,这个类型包含了字段的元数据信息。Type接口只是一个父接口,它有很多子接口和实现类.


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():返回类型名称。
【例10.4】Hibernate元数据接口调用。
package com.cownew.Char15;
import org.hibernate.SessionFactory;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.type.Type;
import com.cownew.PIS.base.permission.common.UserInfo;
import com.cownew.PIS.framework.bizLayer.hibernate.HibernateConfig;
public class HibernateMetaTest
{
public static void main(String[] args)
{
SessionFactory sessionFactory =
HibernateConfig.getSessionFactory();
ClassMetadata entityMetaInfo = sessionFactory
.getClassMetadata(UserInfo.class);
String[] propertyNames = entityMetaInfo.getPropertyNames();
for (int i = 0, n = propertyNames.length; i < n; i++)
{
String propertyName = propertyNames[i];
Type propType = entityMetaInfo.getPropertyType(propertyName);
System.out.println(propertyName + "字段类型为"
+ propType.getReturnedClass().getName());
}
if (entityMetaInfo.hasIdentifierProperty())
{
String idPropName = entityMetaInfo.getIdentifierPropertyName();
Type idPropType = entityMetaInfo.getIdentifierType();
System.out.println("主键字段为:" + idPropName + "类型为"
+ idPropType.getReturnedClass().getName());
} else
{
System.out.println("此实体无主键");
}
}
}

运行结果:
number字段类型为java.lang.String
password字段类型为java.lang.String
person字段类型为com.cownew.PIS.basedata.common.PersonInfo
permissions字段类型为java.util.Set
isSuperAdmin字段类型为java.lang.Boolean
isFreezed字段类型为java.lang.Boolean
主键字段为:id


在位置类的情况下遍历所有元数据

//获得所有元数据
Map<String, ClassMetadata> map= sessionFactory.getAllClassMetadata();
//遍历
for (String key : map.keySet()) {       
                       //获得某个元数据
        AbstractEntityPersister cmd=(AbstractEntityPersister)map.get(key);
                        //获得元数据的信息
    String tbName= cmd.getTableName();
    String[] cols= cmd.getIdentifierColumnNames();
    String pkName="";
    if(cols.length>0){
    pkName=cols[0];
    }
    //遍历类的信息
    Class c=Class.forName(key);
        Field[] fields= c.getDeclaredFields();
        for (Field field : fields) {
        if(field.getName().equalsIgnoreCase(pkName.replace("_", ""))){
        String fType= field.getType().getSimpleName();
        if(!fType.equals("String")){
        tableInfo.put(tbName, pkName);
        }
        break;
        }
}   
   
    }
分享到:
评论

相关推荐

    Hibernate动态建表

    "Hibernate动态建表"指的是在应用运行时根据实体类自动生成对应的数据库表结构,这种特性在开发过程中特别有用,尤其是当数据模型频繁变化或者需要快速原型设计时。 **动态表映射原理** Hibernate的动态建表功能...

    java实体转mysql建表语句

    在Java开发中,将Java实体类转换为MySQL数据库的建表语句是一项常见的任务,它有助于快速构建数据库模型,尤其在使用ORM(对象关系映射)框架如Hibernate、MyBatis时更为便捷。本篇文章将深入探讨这个过程,并提供...

    java动态增加页面元素和动态建表

    总的来说,Java动态增加页面元素和动态建表是Web开发中的关键技术,它们使得开发者能够构建更加灵活、响应式的应用,并且能够处理不确定或变化的数据结构。理解并熟练掌握这些技术对于提高Java Web应用的质量和效率...

    JAVA读取Excel,建库建表,并生成java实体

    在Java开发中,读取Excel数据并利用这些数据进行数据库建库建表以及生成Java实体类是一项常见的任务,尤其在数据导入、数据处理或者自动化测试等场景中。本篇文章将详细探讨如何使用Java来实现这一过程。 首先,...

    java hibernate不同数据库之间的动态切换

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。然而,在某些情况下,我们可能需要在运行时根据不同的条件或需求动态地切换...

    hibernate动态生成表结构

    在Java开发领域,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者通过Java对象来操作数据库,而无需直接编写SQL语句。本文将深入探讨如何利用Hibernate的特性来实现动态生成表结构,以及如何处理表...

    根据hibernate反向生成数据库的java代码

    "根据Hibernate反向生成数据库的Java代码"这一主题涉及到的主要知识点包括Hibernate的逆向工程、实体类生成、数据库元数据以及Java持久化接口。 1. Hibernate逆向工程: Hibernate的逆向工程工具,也被称为...

    JAVA数据类型与Hibernate的类型映射

    而在Java持久化框架Hibernate中,这些数据类型需要与数据库中的字段类型进行映射,以便正确地存储和检索数据。这篇博客主要探讨了Java数据类型如何与Hibernate的类型映射进行对应。 首先,Java的基本数据类型在...

    在Java SE中使用Hibernate处理数据

    在Java SE环境中使用Hibernate处理数据是一项常见的任务,尤其是在开发企业级应用时,需要对数据库进行高效、灵活的管理和操作。Hibernate作为一个流行的Object-Relational Mapping(ORM)框架,能够简化Java程序员...

    java读取接码枪数据后台自动获取usb设备数据

    在Java编程环境中,读取接码枪(扫码枪)数据是一项常见的需求,特别是在物流、仓储、零售等场景中。本文将详细讲解如何实现这个功能,以及如何自动化地从USB设备获取数据并将其存储到数据库或文件中。我们将涵盖...

    JPA注解 和hibernate 建表

    JPA注解和Hibernate建表 一、JPA概述 Java Persistence API(JPA)是Sun官方提出的Java持久化规范,它只是一个规范不是一个产品。JPA的主要目标是提供一种简洁、易用的方式来访问、操作和管理Java应用程序中的数据...

    hibernate3.5多对多自动建表

    用hibernate3.5 xml文件映射,junit实现多对多自动建表,下载后解压用myeclipse导入,这里要注意:需要junit的包。这个是学hibernate的关键,建议新手作为重点,大虾就请多多指教了

    Hibernate建表用到的jar包

    在实际建表操作中,开发者首先需要定义实体类(Entity),并使用Hibernate注解(如@Entity、@Table、@Column等)来指定数据库映射关系。接着,配置Hibernate的SessionFactory,最后通过Session对象执行DDL(Data ...

    利用Middlegen Hibernate3生成hbm.xml配置和java类

    这样,开发者就不需要手动编写hbm.xml文件来描述数据库表与Java类之间的关系,也不需要为每个表创建对应的Java实体类。通过Middlegen,开发者可以快速地将数据库模型转换为Java持久层代码,从而专注于业务逻辑的实现...

    使用hibernate对oracle读取blob

    综上所述,使用Hibernate和JDBC读取Oracle数据库中的Blob数据涉及多个步骤,包括实体类的设计、数据库操作和文件流的处理。理解这些知识点对于处理大对象存储至关重要。在实际项目中,根据需求和性能考虑,选择合适...

    hibernate增删改查代码

    在IT行业中,Hibernate是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑,而不是底层的数据访问细节。本篇文章将详细解析标题"hibernate增删改查代码"所涵盖的知识点,并结合...

    JAVA 使用hibernate配置实例

    在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本教程将详细讲解如何在Java项目中配置和使用Hibernate,包括在普通Java工程...

    java模拟hibernate实现

    在Java编程领域,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本项目通过Java的反射和注解技术,试图模拟Hibernate的部分功能,以便更好...

    Java数据类型,Hibernate数据类型,标准sql数据类型之间的对应表

    当我们在使用Hibernate时,我们需要了解Java数据类型如何与SQL数据类型对应,以便正确地配置实体类和Hibernate的映射文件(通常是.hbm.xml文件或使用注解的方式)。例如,Java的`int`类型通常对应于SQL的`INTEGER`,...

    HIBERNATE - 符合Java习惯的关系数据库持久化

    2. **访问器方法**:实体类应提供getter和setter方法,以便Hibernate通过反射机制读取和更新属性值。 3. **默认构造器**:实体类需包含无参构造器,以满足序列化和反序列化的需求。 4. **标识符属性**:实体类应有一...

Global site tag (gtag.js) - Google Analytics