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();
}
分享到:
相关推荐
本文将详细介绍这三种框架如何整合在一起,并通过具体的XML配置文件来展示整合过程中的关键步骤。 #### 二、核心配置解析 **1. web.xml** `web.xml`是Web应用的核心配置文件,它包含了应用程序的初始化参数、过滤...
为了减少手动编写代码的工作量,可以使用逆向工程工具如Hibernate Tools或JPA Tools来从数据库生成实体类(POJO)、Hibernate映射文件(`.hbm.xml`)以及对应的DAO接口。这些工具通常集成在IDE中,只需要配置好...
接下来是一个简单的Java程序示例,用于生成符合给定Schema的XML文档: ```java import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlObject; import com.example.model.E1Document; public ...
此配置文件定义了一个名为“accp”的持久化单元,指定了事务类型为`RESOURCE_LOCAL`,并指明了具体的持久化提供商为Hibernate。此外,还包含了一些配置属性,例如`hibernate.hbm2ddl.auto`设置为`update`,表示每次...
JDBC提供了一种直接与数据库交互的方式,而Hibernate则是实现了JPA规范的一个具体产品,它为开发者提供了更为抽象和灵活的数据访问层。 - **JDBC**:提供了基本的数据库连接和SQL执行功能,但程序员需要手动处理...