`
zhaoyanfangeye
  • 浏览: 126694 次
  • 性别: 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();

    }
分享到:
评论

相关推荐

    struts2.0 hibernate3 spring2.5整合配置.doc

    本文将详细介绍这三种框架如何整合在一起,并通过具体的XML配置文件来展示整合过程中的关键步骤。 #### 二、核心配置解析 **1. web.xml** `web.xml`是Web应用的核心配置文件,它包含了应用程序的初始化参数、过滤...

    Spring+Hibernate程序架设步骤.doc

    为了减少手动编写代码的工作量,可以使用逆向工程工具如Hibernate Tools或JPA Tools来从数据库生成实体类(POJO)、Hibernate映射文件(`.hbm.xml`)以及对应的DAO接口。这些工具通常集成在IDE中,只需要配置好...

    公司招聘异地笔试题.doc

    接下来是一个简单的Java程序示例,用于生成符合给定Schema的XML文档: ```java import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlObject; import com.example.model.E1Document; public ...

    JAVAJPAJPA学习手册.doc

    此配置文件定义了一个名为“accp”的持久化单元,指定了事务类型为`RESOURCE_LOCAL`,并指明了具体的持久化提供商为Hibernate。此外,还包含了一些配置属性,例如`hibernate.hbm2ddl.auto`设置为`update`,表示每次...

    JPA实体bean配置,jpa增删改api,jpasql增删改.doc

    JDBC提供了一种直接与数据库交互的方式,而Hibernate则是实现了JPA规范的一个具体产品,它为开发者提供了更为抽象和灵活的数据访问层。 - **JDBC**:提供了基本的数据库连接和SQL执行功能,但程序员需要手动处理...

Global site tag (gtag.js) - Google Analytics