熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

用Hibernate3.1實現XML和數據庫的同步

2013-11-23 20:14:41  來源: Java開源技術 

  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()


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28181.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.