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 在 MyEclipse 中根据表结构生成实体和 hbm.xml 文件 在 MyEclipse 中,我们可以使用 Hibernate 根据现有的数据库表结构生成实体和 hbm.xml 配置文件,这样可以避免手动编写 JPA 或 Hibernate 实体类。...
4. 选择文件生成路径:点击 Browse 选择文件生成的路径,这里可以选择一个已经存在的项目目录,以便于管理生成的文件。 5. 配置反转选项:在反转选项中,可以选择是否生成 DAO 类、Id Generator 的类型等。 6. 设置 Id...
在Java的持久化框架Hibernate中,`hibernate.hbm.xml`文件是至关重要的,它定义了Java对象与数据库表之间的映射关系,使得对象模型能够与关系型数据库无缝对接。这篇文章将深入解析`hibernate.hbm.xml`的结构和主要...
然而,在实际开发过程中,我们可能会遇到一些问题,比如在处理`hbm.xml`文件中的中文注释时出现乱码,或者希望自动生成的实体类中包含有详细的注释。本文将详细介绍如何利用`Hibernate-tools`来解决这些问题,以`...
生成的 POJO 类将存放在我们指定的存放位置,并且映射文件 .hbm.xml 将被添加到 hibernate.cfg.xml 文件中。 使用 MyEclipse 工具生成 POJO 类和映射文件 .hbm.xml 非常简单。MyEclipse 提供了许多实用的功能来帮助...
在IT行业中,尤其是在Java开发领域,MyEclipse是一款非常受欢迎的集成开发环境,它提供了许多...一旦hbm.xml文件生成,就可以结合Hibernate框架轻松地进行数据库的CRUD操作,大大提升了开发的便捷性和项目的可维护性。
请输入包的名称和映射文件需要放到的文件夹之后运行CreateTableXml里的main方法,就可以自动生成映射文件了。记着刷新文件夹,要不然是看不到的。 当然只是一些基础的属性。对于一些比较复杂,还是需要自己来修改的...
本主题聚焦于如何在Oracle环境中自动生成Hibernate实体类(`.java`文件)及其对应的映射文件(`.hbm.xml`文件)。这个过程通常是为了减少手动编写这些文件的工作量,提高开发效率。 首先,我们需要理解`Oracle`存储...
hbm.xml文件中的name名字与实体类中不符合.
在开发过程中,为了减少手动编写实体类(Entity)和对应的hbm.xml配置文件的工作量,Hibernate提供了一个逆向工程工具,可以基于现有数据库结构自动生成这些代码。 实体类是Java对象,它们代表数据库中的表,而hbm....
1. `<class>`:定义一个Java类,对应数据库中的一个表。 2. `<id>`:标识对象的唯一标识,对应数据库表的主键。 3. `<property>`:表示类的属性,对应数据库表的列。 4. `<one-to-one>`, `<many-to-one>`, `...
标题中的“利用Middlegen Hibernate3生成hbm.xml配置和java类”指的是使用Middlegen工具来自动化创建Hibernate3框架所需的映射文件(hbm.xml)和对应的Java实体类。这个过程是数据库对象到Java对象(O/R Mapping)的...
hibernate.queries.hbm.xml这个文件需要放在jbpm*(版本).jar中。。的org.jbpm.db目录下,先删除以前的文件,然后,换上共享中这个。。大家可以用文件比较器看看,并没有改变以前的,只是新加了。。
在 Hibernate 中,`hbm.xml` 文件是用于定义对象与数据库表之间映射的元数据文件。这篇文档将深入解析 `hbm.xml` 配置的各个方面。 ### 1. `hbm.xml` 文件结构 `hbm.xml` 文件的开头通常包含 XML 声明和 DTD 引用...
在MyEclipse中,需要新建一个WEB项目来容纳生成的Hibernate文件。具体步骤如下: 1. 新建WEB Project,名为hibernate_demo 2. 在项目上右键->MyEclipse->Add HibernateCapabilities,为工程添加Hibernate功能 3. ...
- 对于通过hbm.xml生成的实体类,需要在hibernate.cfg.xml中添加相应的映射文件路径。 3. **测试连接**: - 运行测试程序,验证Hibernate是否能够正确读取映射信息并与数据库交互。 通过以上步骤,我们不仅能够...
标题中的“从hbm的xml文件自动生成数据库表”指的是在Java编程中,使用Hibernate框架的一个功能,通过Hibernate Mapping(hbm.xml)文件来自动创建对应的数据库表结构。Hibernate是流行的Java ORM(对象关系映射)...
例如,如果我们有一个名为`petclinic.hbm.xml`的映射文件,我们可以这样配置: ```xml <value>petclinic.hbm.xml ``` 这种方式只能处理单个映射文件,不支持通配符或路径。 2. `mappingLocations`: 这个...
在这种加载方式中,`hbm.xml` 文件与对应的实体类文件放在同一个项目目录下,通常位于资源文件夹内。通过NHibernate的`Configuration`类,我们可以直接指定XML映射文件的位置,例如`configuration.AddInputStream...