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();
}
分享到:
相关推荐
通过myeclipse自动生成Hibernate类文件和hbm.xml文件,链接数据库库自动生成
对hibernate.hbm.xml解释很详细~ 开发的时候很有用的哦~!
生成的 POJO 类将存放在我们指定的存放位置,并且映射文件 .hbm.xml 将被添加到 hibernate.cfg.xml 文件中。 使用 MyEclipse 工具生成 POJO 类和映射文件 .hbm.xml 非常简单。MyEclipse 提供了许多实用的功能来帮助...
利用hibernate自动生成hbm.xml文件和entity类,挺详细的文档呢,可以参考看看的喔喔
hbm.xml文件中的name名字与实体类中不符合.
hibernate 根据表生成实体和hbm.xml配置文件
请输入包的名称和映射文件需要放到的文件夹之后运行CreateTableXml里的main方法,就可以自动生成映射文件了。记着刷新文件夹,要不然是看不到的。 当然只是一些基础的属性。对于一些比较复杂,还是需要自己来修改的...
hibernate。hbm.xml配置详解.doc hibernate。hbm.xml配置详解.doc hibernate。hbm.xml配置详解.doc
Hibernate逆向生成entity和hbm.xml文件这是一个视频,比文件看起来更加给力。
hibernate.queries.hbm.xml这个文件需要放在jbpm*(版本).jar中。。的org.jbpm.db目录下,先删除以前的文件,然后,换上共享中这个。。大家可以用文件比较器看看,并没有改变以前的,只是新加了。。
MyEclipse生成hbm.xml文件(全图解)--很详细的步骤,让你一目了然。
以hibernate-tools-5.2.1.Final.jar为例,5.0以下的版本尚未验证
myeclipse中自动生成hibernate的POJO、DAO和hbm.xml文件,自己整理了一下,以防以后忘了。
Hibernate4的全套jar包,及hbm.xml(模板)+hibernate.cfg.xml(模板)+c3p0(全套)+ojdbc14.jar
Hibernate关联关系hbm.xml中的相关属性many-to-one/one-to-many/many-to-many 中所有属性值以及其用法。
实例代码,详细描述了三种hbm.xml加载方式,包含NHibernate的基础操作,内附测试数据库。辅加数据库后可直接运行。
Oracle自动生成hibernate实体 首先需要有个表A0,然后以要生成实体的表名称为参数执行存储过程,生成的结果就在A0表里。
主要介绍通过Hibernate不用别的插件,逆向生成实体类的方法,包括标签注解映射和hbm.xml文件映射两种
hibrenate hbm.xml 表映射
NULL 博文链接:https://skiof007.iteye.com/blog/1796910