`
zhaoyanfangeye
  • 浏览: 125697 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

w3c 中doc生成一个基于hibernate的hbm.xml文件

阅读更多
package com.gosophia.metadataEngine.commons;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.hibernate.Session;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentType;
import org.w3c.dom.Element;
import org.w3c.dom.Text;

import com.gosophia.metadataEngine.entity.MetadataField;
import com.gosophia.metadataEngine.entity.MetadataTable;

/**
 * 
 * 将一个Table信息转化为一个xml文件
 * 
 * @创建日期 2010-5-28
 * 
 * @版本 V1.0
 */
public class MatadataTableToXML {
    public final static String PUBLIC = "-//Hibernate/Hibernate Mapping DTD 3.0//EN";// 头部信息
    public final static String SYSTEM = "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd";// 头部信息dtd
    public final static String PATH = "src/main/resources/hbmXml/";// 创建文件输出的路径
    public final static String FILETYPE = ".hbm.xml";// 创建出文件的类型;
//    DocumentType d
    /**
     * 
     * @param tableId
     *            表的编号
     */
    public static void createXml(long tableId, Session session) {
        // 创建一个解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = null;
        
        try {
            documentBuilder = factory.newDocumentBuilder();
            Document document =documentBuilder.newDocument();
            // 创建一个根节点
            Element root = document.createElement("hibernate-mapping");
            document.appendChild(root);
            // 创建一个类节点
            Element classNode = document.createElement("class");
            // 获得当前系统表
            MetadataTable metadata = (MetadataTable) session.get(
                    MetadataTable.class, tableId);
            if(metadata==null){
                throw new RuntimeException("元数据表为空!");
            }
            // 添加属性--value是动态的------
            classNode
                    .setAttribute("entity-name", metadata.getEntityClassName());
            classNode.setAttribute("table",metadata.getTableName());
            root.appendChild(classNode);

            // 获得当前表所对应的字段
            List<MetadataField> fields = metadata.getColTabMetadataFields();
            Iterator<MetadataField> iterField = fields.iterator();
            while (iterField.hasNext()) {
                MetadataField metadataField = iterField.next();
                // 判断是否是主键
                if (metadataField.getEntityPropertyName() != null
                        && metadataField.getEntityPropertyName().trim()
                                .toLowerCase().equals("id")) {
                    Element id = document.createElement("id");
                    id.setAttribute("name", metadataField
                            .getEntityPropertyName());
                    id.setAttribute("type", metadataField
                            .getEntityPropertyType());
                    id.setAttribute("column", metadataField.getFieldName());
                    // 主键生成策略
                    Element generator = document.createElement("generator");
                    generator.setAttribute("class", "sequence");
                    id.appendChild(generator);
                    classNode.appendChild(id);
                } else {
                    Element property = document.createElement("property");
                    property.setAttribute("name", metadataField
                            .getEntityPropertyName());
                    property.setAttribute("column", metadataField
                            .getFieldName());
                    property.setAttribute("type", metadataField
                            .getEntityPropertyType());
                    classNode.appendChild(property);
                }
            }
            // 创建一个转换器工厂
            TransformerFactory transFactroy = TransformerFactory.newInstance();
            Transformer transforer = transFactroy.newTransformer();
            transforer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, SYSTEM);
            transforer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, PUBLIC);
            // 将文档对象封装在DOMSource中
            DOMSource domsource = new DOMSource(document);
            // 定义一个xml文件输出目录
            File file = new File(PATH + metadata.getEntityClassName()
                    + FILETYPE);
            FileOutputStream fileOutPut = new FileOutputStream(file);

            StreamResult xmlResult = new StreamResult(fileOutPut);
            transforer.transform(domsource, xmlResult);
            
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
/*******
* Configuration动态读取生成出来的hbm文件
*/
//文件生成出的路径
    public static String LOCATION = SessionUtil.class.getProtectionDomain()
            .getCodeSource().getLocation().getFile()
            + "/../";
    /**
     * 重新扫描hbm配置文件(xml)
     */
    public synchronized static void reloadConfiguration() {
        if (sessionFactory != null && !sessionFactory.isClosed()) {
            sessionFactory.close();
            sessionFactory = null;
        }

        Configuration config = new AnnotationConfiguration().configure();

        File file = new File(SessionUtil.LOCATION + "hbmXml/");

        if (!file.exists()) {
            sessionFactory = null;
        } else {
            // 解析动态生成的hbm文件
            config.addDirectory(file);
            sessionFactory = config.buildSessionFactory();
        }
    }

======================================================================
       /**
     * 
     * @param tableId
     *            表的编号
     * 已String字符串的方式保存xml
     */
    public static String createXmlString(long tableId, Session session) {
        // 创建一个解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = null;
        ByteArrayOutputStream  outputStream=new  ByteArrayOutputStream();
        try {
            documentBuilder = factory.newDocumentBuilder();
            Document document = documentBuilder.newDocument();
            // 创建一个根节点
            Element root = document.createElement("hibernate-mapping");
            document.appendChild(root);
            // 创建一个类节点
            Element classNode = document.createElement("class");
            // 获得当前系统表
            MetadataTable metadata = (MetadataTable) session.get(
                    MetadataTable.class, tableId);
            if (metadata == null) {
                throw new RuntimeException("元数据表为空!");
            }
            // 添加属性--value是动态的------
            classNode
                    .setAttribute("entity-name", metadata.getEntityClassName());
            classNode.setAttribute("table", metadata.getTableName()
                    .toLowerCase());
            root.appendChild(classNode);

            // 获得当前表所对应的字段
            List<MetadataField> fields = metadata.getColTabMetadataFields();
            Iterator<MetadataField> iterField = fields.iterator();
            while (iterField.hasNext()) {
                MetadataField metadataField = iterField.next();
                // 判断是否是主键
                if (metadataField.getEntityPropertyName() != null
                        && metadataField.getEntityPropertyName().trim()
                                .toLowerCase().equals("id")) {
                    Element id = document.createElement("id");
                    id.setAttribute("name", metadataField
                            .getEntityPropertyName());
                    id.setAttribute("type", metadataField
                            .getEntityPropertyType());
                    id.setAttribute("column", metadataField.getFieldName());
                    // 主键生成策略
                    Element generator = document.createElement("generator");
                    generator.setAttribute("class", "sequence");
                    id.appendChild(generator);
                    classNode.appendChild(id);
                } else {
                    Element property = document.createElement("property");
                    property.setAttribute("name", metadataField
                            .getEntityPropertyName());
                    property.setAttribute("column", metadataField
                            .getFieldName());
                    property.setAttribute("type", metadataField
                            .getEntityPropertyType());
                    classNode.appendChild(property);
                }
            }
            // 创建一个转换器工厂
            TransformerFactory transFactroy = TransformerFactory.newInstance();
            Transformer transforer = transFactroy.newTransformer();
            transforer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, SYSTEM);
            transforer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, PUBLIC);
            // 将文档对象封装在DOMSource中
            DOMSource domsource = new DOMSource(document);
            outputStream  =  new  ByteArrayOutputStream(); 
            StreamResult xmlResult = new StreamResult(outputStream);
            transforer.transform(domsource, xmlResult);
        } catch (TransformerConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally{
            
            try {
                outputStream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return outputStream.toString();
    }
}
/***
*读取String方式的hbm文件
*
/
    /**
     * 重新扫描hbm配置文件
     */
    public synchronized static void reloadConfiguration(List<String> strXml) {
        if (sessionFactory != null && !sessionFactory.isClosed()) {
            sessionFactory.close();
            sessionFactory = null;
        }

        Configuration config = new AnnotationConfiguration().configure();
        List<String> newXml = strXml;
        for (String xml : newXml) {
            // 解析动态生成的hbm文件
            config.addXML(xml);
        }
        sessionFactory = config.buildSessionFactory();

    }
分享到:
评论

相关推荐

    自动生成Hibernate类文件和hbm.xml文件

    通过myeclipse自动生成Hibernate类文件和hbm.xml文件,链接数据库库自动生成

    在myeclipse中根据表结构生成实体和hbm.xml文件

    Hibernate 在 MyEclipse 中根据表结构生成实体和 hbm.xml 文件 在 MyEclipse 中,我们可以使用 Hibernate 根据现有的数据库表结构生成实体和 hbm.xml 配置文件,这样可以避免手动编写 JPA 或 Hibernate 实体类。...

    利用hibernate自动生成hbm.xml文件和entity类.doc

    4. 选择文件生成路径:点击 Browse 选择文件生成的路径,这里可以选择一个已经存在的项目目录,以便于管理生成的文件。 5. 配置反转选项:在反转选项中,可以选择是否生成 DAO 类、Id Generator 的类型等。 6. 设置 Id...

    hibernate.hbm.xml详解

    在Java的持久化框架Hibernate中,`hibernate.hbm.xml`文件是至关重要的,它定义了Java对象与数据库表之间的映射关系,使得对象模型能够与关系型数据库无缝对接。这篇文章将深入解析`hibernate.hbm.xml`的结构和主要...

    Hibernate-tools解决hbm.xml中文注释乱码和生成实体类注释

    然而,在实际开发过程中,我们可能会遇到一些问题,比如在处理`hbm.xml`文件中的中文注释时出现乱码,或者希望自动生成的实体类中包含有详细的注释。本文将详细介绍如何利用`Hibernate-tools`来解决这些问题,以`...

    使用MyEclipse工具生成POJO类和映射文件.hbm.xml

    生成的 POJO 类将存放在我们指定的存放位置,并且映射文件 .hbm.xml 将被添加到 hibernate.cfg.xml 文件中。 使用 MyEclipse 工具生成 POJO 类和映射文件 .hbm.xml 非常简单。MyEclipse 提供了许多实用的功能来帮助...

    MyEclipse生成hbm.xml文件(全图解)

    在IT行业中,尤其是在Java开发领域,MyEclipse是一款非常受欢迎的集成开发环境,它提供了许多...一旦hbm.xml文件生成,就可以结合Hibernate框架轻松地进行数据库的CRUD操作,大大提升了开发的便捷性和项目的可维护性。

    根据实体类自动生成hibernate的hbm.xml映射文件

    请输入包的名称和映射文件需要放到的文件夹之后运行CreateTableXml里的main方法,就可以自动生成映射文件了。记着刷新文件夹,要不然是看不到的。 当然只是一些基础的属性。对于一些比较复杂,还是需要自己来修改的...

    Oracle自动生成hibernate实体(.java 和.hbm.xml文件)存储过程

    本主题聚焦于如何在Oracle环境中自动生成Hibernate实体类(`.java`文件)及其对应的映射文件(`.hbm.xml`文件)。这个过程通常是为了减少手动编写这些文件的工作量,提高开发效率。 首先,我们需要理解`Oracle`存储...

    hbm.xml文件中的name名字与实体类中不符合

    hbm.xml文件中的name名字与实体类中不符合.

    Hibernate逆向生成entity和hbm.xml文件

    在开发过程中,为了减少手动编写实体类(Entity)和对应的hbm.xml配置文件的工作量,Hibernate提供了一个逆向工程工具,可以基于现有数据库结构自动生成这些代码。 实体类是Java对象,它们代表数据库中的表,而hbm....

    Hibernate的........htm.xml和hibernatecfg.xml配置

    1. `&lt;class&gt;`:定义一个Java类,对应数据库中的一个表。 2. `&lt;id&gt;`:标识对象的唯一标识,对应数据库表的主键。 3. `&lt;property&gt;`:表示类的属性,对应数据库表的列。 4. `&lt;one-to-one&gt;`, `&lt;many-to-one&gt;`, `...

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

    标题中的“利用Middlegen Hibernate3生成hbm.xml配置和java类”指的是使用Middlegen工具来自动化创建Hibernate3框架所需的映射文件(hbm.xml)和对应的Java实体类。这个过程是数据库对象到Java对象(O/R Mapping)的...

    hibernate.queries.hbm.xml

    hibernate.queries.hbm.xml这个文件需要放在jbpm*(版本).jar中。。的org.jbpm.db目录下,先删除以前的文件,然后,换上共享中这个。。大家可以用文件比较器看看,并没有改变以前的,只是新加了。。

    hibernate。hbm.xml配置详解

    在 Hibernate 中,`hbm.xml` 文件是用于定义对象与数据库表之间映射的元数据文件。这篇文档将深入解析 `hbm.xml` 配置的各个方面。 ### 1. `hbm.xml` 文件结构 `hbm.xml` 文件的开头通常包含 XML 声明和 DTD 引用...

    myeclipse中自动生成hibernate的POJO、DAO和hbm.xml文件

    在MyEclipse中,需要新建一个WEB项目来容纳生成的Hibernate文件。具体步骤如下: 1. 新建WEB Project,名为hibernate_demo 2. 在项目上右键-&gt;MyEclipse-&gt;Add HibernateCapabilities,为工程添加Hibernate功能 3. ...

    使用Hibernate逆向生成实体类的方法(注解和hbm.xml映射文件)

    - 对于通过hbm.xml生成的实体类,需要在hibernate.cfg.xml中添加相应的映射文件路径。 3. **测试连接**: - 运行测试程序,验证Hibernate是否能够正确读取映射信息并与数据库交互。 通过以上步骤,我们不仅能够...

    从hbm的xml文件 自动生成数据库表

    标题中的“从hbm的xml文件自动生成数据库表”指的是在Java编程中,使用Hibernate框架的一个功能,通过Hibernate Mapping(hbm.xml)文件来自动创建对应的数据库表结构。Hibernate是流行的Java ORM(对象关系映射)...

    spring如何摒弃hibernate.cfg.xml

    例如,如果我们有一个名为`petclinic.hbm.xml`的映射文件,我们可以这样配置: ```xml &lt;value&gt;petclinic.hbm.xml ``` 这种方式只能处理单个映射文件,不支持通配符或路径。 2. `mappingLocations`: 这个...

    NHibernate实例代码 三种hbm.xml加载方式

    在这种加载方式中,`hbm.xml` 文件与对应的实体类文件放在同一个项目目录下,通常位于资源文件夹内。通过NHibernate的`Configuration`类,我们可以直接指定XML映射文件的位置,例如`configuration.AddInputStream...

Global site tag (gtag.js) - Google Analytics