Hibernate是一套开源的用于对象/关系持久化和查询服务的Java库现在Hibernate的最新版本是在这个版本中引入了一个新的特性XML到数据库映射(也可以看做是XML和数据库的同步)这个功能允许程序员将基于XML文档的数据映射成数据库(在当前版本的Hibernate中支持DBMySQLOracle和PostgreSQL)通过使用Hibernate可以将XML文档的节点(Node)映射成数据库的列每一个XML文件直接被映射成一个数据库表在这个过程中并不要求一个POJOHibernate可以根据需要生成相应的SQL(包括createupdatedeleteinsert等) 我们还可以通过Hibernate的配置文件生成新表并将XML数据添加到数据库中还能以XML格式得到数据库表中的数据并通过XML的方式增加或更新数据同时Hibernate还支持domj API并且支持Ant在本文中将学习如何使用Hibernate开发一个基于XML映射的应用程序
我们要做的第一项工作就是设计数据库配置属性这些属性可以在hibernateproperties中设置这此属性主要包括要连接的数据库JDBC驱动类以及连接数据库的连接字符串还需要设置一个映射文件hbmxml这个文件指定了XML文档的节点和相应的数据表中的列的对应关系Java Bean要映射的数据表名也在这个文件中指定我们可以使用orghibernatetoolhbmddlSchemaExport工具将映射文件映射到数据表上本文将详细描述如何将一个Cataloghbmxml文件映射到一个Oracle数据表上
一准备工作
在开始本文的讲解前需要先安装用于开发的Hibernate应用程序包我们可以从下载Hibernate的版然后需要安装Oracle g详细的安装过程请参考相关的文章最后我们将本程序所需要的Hibernate的jar文件加到加到CLASSPATH环境变量中这些jar文件如表所示
jar文件
描述
hibernatejar
这是hibernate主要的jar包其中orghibernatetoolhbmddlSchemaExport就包含在这个文件中
domjjar
commonsloggingjar
commonscollectionsjar
ehcachejar
cglibjar
jtajar
asmjar
antlrrcjar
jaxenbetajar
这九个jar文件是包含了Hibernate的辅助类
classesjar or ojdbcjar
这是操作Oracle数据库的JDBC类
表 Hibernate的jar文件
在本节中我们将学习如何从一个XML映射文件生成一个数据库表这个工作可以通过hibernateproperties文件实现这个文件将指定数据库的设置信息和hbmxml映射文件如果你使用一个配置文件(hibernatecfgxml)来指定数据库属性那么hibernateproperties文件将不再需要……hbmxml文件包含了将XML文档节点映射成数据库表的类的定义以及表名和XML文档相对应的列除了这些还需要指定列的类型长度是否为null以及是否唯一表列了一些主要的映射文件设置项
设置项
描述
hibernatemapping
这是根设置项它包含了schema和package属性和class字设置项
class
指定映射到数据库表的实体包括tableschemaentityname和node属性它的子设置项有idpropertyset和list
id
在定义类时要求的设置项包括columntype和length属性和columngenerator设置项
property
指定某个实体的属性和相应的数据库表列包含typecolumnlength和notnull属性
表 Hibernate映射文件的主要设置项
在本文的例子的映射文件指定了一个实体Catalog其中包含了Catalog的节点(也就是列)XML文档节点在节点属性中指定这个例子映射文件Cataloghbmxml在表中指定其中<generator class=native/>指定了唯一标识符的产生策略我们可以在Hibernateproperties文件中指定JDBC配置信息在hibernateproperties文件中包含的属性通过<property>=<value>指定JDBC的部分配置将在表中列出
属性
描述
nnectiondriver_class
连接数据库的驱动类
nnectionurl
用于连接数据库的连接字符串
hibernatedialect
数据库类型
nnectionusername
登录数据库的用户名
nnectionpassword
登录数据库的密码
表 Hibernateproperties的部分属性
在本文的例子中将数据库驱动类指定为oraclejdbcdriverOracleDriver连接字符串使用Oracle的第四种类型连接字符串数据库类型为Oracle
hibernateproperties的设置如下所示
nnectiondriver_class=oraclejdbcdriverOracleDriver
nnectionurl=jdbc:oracle:thin:@localhost::OracleDB
nnectionusername=user
nnectionpassword=mypw
hibernatedialect=orghibernatedialectOracleDialect
在本例中将使用orghibernatetoolhbmddlSchemaExport工具根据Cataloghbmxml和hibernateproperties文件来产生一个Oracle数据表
首先将hibernateproperties和Cataloghbmxml文件复制到同一个目录下如d\hibernate然后启动Oracle数据库服务接下来使用如下命令产生一个Oracle数据库表
java orghibernatetoolhbmddlSchemaExport properties=hibernateproperties Cataloghbmxml
在执行完上面的命令后在Oracle数据库就建立了一个userCatalog表
在这一节我们将开发一个Java应用程序就于将XML文档转换成在上一节所描述的数据表 我们将使用表示所描述的catalogxml中的数据
这个Java应用程序将映射文件用于数据持久化的属性文件集成到了一起首先将Cataloghbmxml和hibernateproperties文件复制到同一个目录并将这个目录加到CLASSPATH中在Java应用程序中使用import导入orghibernate包和domj包
orghibernateSession是主要的运行时接口它负责将Java应用程序和Hibernate连接起来你可以使用它在数据库表中增加获得更新和删除XML数据我们可以从一个SessionFactory中获得一个Session对象这个SessionFactory接口提供了openSession方法用来创建一个数据库连接以及打开一个连接会话orghibernatecfgConfiguration类用来指定配置属性和创建一个SessionFactory的映射文件下面的代码将创建一个配置对象
Configuration config=new Configuration();
下面的代码将映射文件cataloghbmxml加入到配置中
configaddFile(cataloghbmxml)
现在映射文件Cataloghbmxml以及JDBC属性文件在相同的目录并且应用程序使用配置对象获得这此文件的信息下面的代码将创建一个SessionFactory对象
SessionFactory sessionFactory=configbuildSessioFactory();
接下来将向使用SchemaExport工具创建的数据表中加入数据首先从SessionFactory对象中得到一个Session对象
Session sess =sessionFactoryopenSession();
下面的代码将得一个Transaction对象我们可以使用这个对象向数据表中加入数据
orghibernateTransaction tx = sessbeginTransaction();
使用DOMJ模式开始一个会话第二个会话和第一个主会话有同样的连接事务和上下文属性
Session domjSession = sessiongetSession(EntityModeDOMJ);
下面将创建一个SAXReader对象用于分析描述数据表的XML文档我们可以使用read(File)方法来分析catalogxml文件代码如下
SAXReader saxReader = new SAXReader();
Document document = saxReaderread(new File(c:/Hibernate/catalogxml));
下面的代码将获得文档对象中catalog节点的列表并且创建一个Iterator对象用于浏览列表中止数据
List list = documentselectNodes(//catalog)
Iterator iter = erator()
Iterate可以枚举列表中的对象并且从列表中获得相应的节点我们可以使用save(String entityNameObject object)方法来将节点数据保存在数据库中其实save方法并不会真的将数据保存在数据库中要想物理保存必须使用flush方法来同步数据库和XML文档代码如下
while(iterhasNext())
{
Object catalog = iternext();
domjSessionsave(Catalog catalog);
}
最后我们将使用flush来保存Session使用commit来提交事务使用close来关闭会话代码如下
sessionflush()
mit()
sessionclose()
在这一节中我们将从一个数据表中以XML的形式得到数据和上一节一样需要创建一个配置对象并且将映射文件cataloghbmxml加到配置对象中代码如下
configuration config = new Configuration()
configaddFile(cataloghbmxml)
然后从配置对象创建一个SessionFactory对象并且使用SessionFactory打开一个会话对象
sessionFactory sessionFactory = configbuildSessionFactory()
session = sessionFactoryopenSession()
使用DOMJ实体模式创建一个新会话代码如下
Session domjSession = sessiongetSession(EntityModeDOMJ)
开始一个新事务代码如下
tx = sessionbeginTransaction()
下一步将使用Catalog中的数据来创建一个XML文档首先使用静态方法createDocument方法(在DocumentHelper类中)来创建一个Document对象并将catalogs元素加到Document对象中代码如下
Document document = DocumentHelpercreateDocument()
Element rootElement = documentaddElement(catalogs)
创建一个Hibernate查询(HQL)用来查询表中的数据HQL的语法类似SQL的语法在HQL中并不要求Select子句在From子句后面需要加实体名而不是数据库表名HQL的代码如下
String hqlQuery =FROM Catalog
在写完HQL后需要使用Session对象的createQuery(hqlQuery)方法创建一个查询对象并通过list()方法得到相应的查询结果代码如下
List results = domjSessioncreateQuery(hqlQuery)list()
下面的代码将枚举返回结果中所有的数据每一行对应XML文档中的一个catalog节点并将catalog加入到每一个文档对象的根元素中
for (int i = i < resultssize() i++)
{
Element catalog = (Element) resultsget(i)
rootElementadd(catalog)
}
下面的代码使用XMLWriter对象将数据输出到XML文档对象中
XMLWriter output = new XMLWriter(new FileWriter(new File(c/catalog/catalogxml)))
outputwrite(document)
在这一节我们将使用Hibernate API删除一行记录我们需要在catalogdeletexml中指定要删除的行首先创建一个Configuration对象并将cataloghbmxml加入到Configuration对象中
configuration config = new Configuration()
configaddFile(cataloghbmxml)
下面的代码将创建一个SessionFactory对象并使用openSession方法打开一个会话
sessionFactory sessionFactory = configbuildSessionFactory()
session = sessionFactoryopenSession()
下面的代码将使用DOMJ模式创建一个Session对象这个Session对象和DOMJ将拥有同样的连接事务和上下文属性代码如下
Session domjSession = sessiongetSession(EntityModeDOMJ)
创建一个事务代码如下
tx = sessionbeginTransaction()
创建一个SAXReader对象用来分析XML文档catalogdeletexml代码如下
SAXReader saxReader = new SAXReader()
Document document = saxReaderread(xmlDocument)
下面的代码将得到catalog节点对象并创建一个Iterator对象(为了枚举这个节点的字节点)代码如下
List list = documentselectNodes(//catalog)
Iterator iter = erator()
下面的代码将枚举catalog中的所有数据并将Catalog删除代码如下
while (iterhasNext())
{
Object catalog = iternext()
domjSessiondelete(Catalog catalog)
}
最后需要将Session保存并关闭Session代码如下
sessionflush()
mit()
sessionclose()