天天看點

對“純手工編寫的第一個Hibernate程式”的改進

?xml:namespace>

我們在目錄E:\DemoPrograms下建立一個目錄ImprovedHibernate,來儲存本執行個體所有的檔案。

首先來看User(User.java檔案中)類。

package com.abc.people;  

public class User {  

    private int id;  

    private String name;  

    private int age;  

    private String gender;  

    public int getId() {  

        return id;  

    }  

    public void setId(int id) {  

        this.id = id;  

    public String getName() {  

        return name;  

    public void setName(String name) {  

        this.name = name;  

    public int getAge() {  

        return age;  

    public void setAge(int age) {  

        this.age = age;  

  public String getGender()  

  {  

     return gender;  

  }  

  public void setGender(String gender)  

     this.gender = gender;  

}  

(User類)

如上述第一行代碼所示,我們将User類聲明在com.abc.people包中。包的層次結構與目錄的層次結構是一一對應的。是以,我們在目錄ImprovedHibernate下建立目錄結構com\abc\people(如下圖所示)。

然後将User.java放置到people目錄中,編譯之。實際上,User.java檔案放置在哪裡并不重要,重要的是編譯後的User.class檔案要在正确的位置。經過上述的編譯後,就在正确的位置——people目錄下——生成了User.class檔案。

再來看User.hbm.xml映射檔案。由于目前User類在包com.abc.people中,是以在hibernate-mapping元素中就用package屬性指定了此包名。如下面的第六行所示。

<?xml version="1.0" encoding="gb2312"?> 

<!DOCTYPE hibernate-mapping PUBLIC  

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  

    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

    <!--package指定類的包字首--> 

    <hibernate-mapping package="com.abc.people"> 

    <class name="User" table="users"> 

           <id name="id" type="java.lang.Integer" column="ID"> 

              <generator class="identity"/> 

         </id> 

         <property name="age" column="age"/> 

         <property name="name"/> 

         <property name="gender"/> 

    </class> 

</hibernate-mapping> 

(User.hbm.xml檔案)

此檔案應與User.java檔案放置在同一目錄下(更準确地講,是應該與User.class放置在同一目錄下),即ImprovedHibernate下的com\abc\people目錄下。

接着來看配置檔案hibernate.cfg.xml。由于映射檔案User.hbm.xml放置在了目錄com\abc\people中,是以需要修改resource的值。如下面的20至22行所示。 

<!DOCTYPE hibernate-configuration PUBLIC  

        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  

        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 

       <session-factory> 

        <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> 

        <property name="connection.url">jdbc:sqlserver://localhost;databaseName=mydb</property> 

        <property name="connection.username">sa</property> 

        <property name="connection.password">admin123</property> 

        <property name="connection.pool_size">1</property> 

        <property name="dialect">org.hibernate.dialect.SQLServerDialect</property> 

        <property name="current_session_context_class">thread</property> 

        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

        <property name="show_sql">true</property> 

        <!--指定要用到的映射檔案,要寫出相對于ImprovedHibernate  

        目錄的完整路徑。--> 

        <mapping resource="com/abc/people/User.hbm.xml" /> 

    </session-factory> 

</hibernate-configuration> 

hibernate.cfg.xml檔案

這裡需要注意的是,用的是“/”作為分隔符,而不是Windows風格的“\”。

接着來修改TestHibernate.java檔案。我們把它聲明在com.abc包下,并修改此程式的功能為讀取第一個hibernate程式中儲存的阿湯哥的資訊。具體如下所示:

//包聲明。  

package com.abc;  

import org.hibernate.Session;  

import org.hibernate.SessionFactory;  

import org.hibernate.cfg.Configuration;  

//注意要正确地引入User類。  

import com.abc.people.User;  

public class TestHibernate {  

    public static void main(String[] args) {  

    Configuration cfg = new Configuration().configure();  

    SessionFactory factory = cfg.buildSessionFactory();  

    Session session = factory.getCurrentSession();  

        session.beginTransaction();  

        //從資料庫中加載一個User執行個體。需要兩個參數,第一個參數  

        //com.abc.people.User.class是User類的Class(參見Class類  

        //的相關内容)對象。1是這個User執行個體的辨別屬性。實際上就  

        //是根據主鍵從資料庫中讀取一條記錄,然後封裝成一個User對象。  

        //是不是比自己寫JDBC語句友善、自然多了呢?  

        User user = (User)session.load(com.abc.people.User.class, 1);  

        String name = user.getName();  

        String gender = user.getGender();  

        System.out.println("****************");  

        System.out.println("* 姓名:" + name+" *");  

        System.out.println("* 性别:" + gender+"     *");  

        session.getTransaction().commit();  

        factory.close();  

    }     

 (TestHibernate.java檔案)

相應地,根據其所在包名,此檔案應放置在ImprovedHibernate目錄下的com\abc目錄下。

此時若編譯TestHibernate.java,則會報一大堆的錯誤,說XX包不存在,YY符号找不到。這是因為我們還沒有引入程式要用到的hibernate的JAR包,也沒有正确地設定CLASSPATH環境變量。這次要用到的JAR包和上次一樣,是以隻需簡單地把上次用到的lib目錄拷貝到ImprovedHibernate下即可。此時,整個執行個體的目錄結構如下圖所示:

<a href="http://blog.51cto.com/attachment/201112/094220848.jpg" target="_blank"></a>

下一步就是應該編寫批處理檔案setclasspath.bat了。與上篇的批處理檔案類似,需要把要用到的JAR包添加到CLASSPATH中。尤為重要的是,不要漏掉了目前目錄。此批處理檔案的内容如下。 

set classpath=.;E:\DemoPrograms\ImprovedHibernate\lib\hibernate3.jar;E:\DemoPrograms\ImprovedHibernate\lib\sqljdbc4.jar;E:\DemoPrograms\ImprovedHibernate\lib\dom4j-1.6.1.jar;E:\DemoPrograms\ImprovedHibernate\lib\slf4j-api-1.6.2.jar;E:\DemoPrograms\ImprovedHibernate\lib\slf4j-simple-1.6.2.jar;E:\DemoPrograms\ImprovedHibernate\lib\hibernate-jpa-2.0-api-1.0.1.Final.jar;E:\DemoPrograms\ImprovedHibernate\lib\cglib-2.2.jar;E:\DemoPrograms\ImprovedHibernate\lib\commons-collections-3.1.jar;E:\DemoPrograms\ImprovedHibernate\lib\javassist-3.12.0.GA.jar;E:\DemoPrograms\ImprovedHibernate\lib\jta-1.1.jar 

(批處理檔案setclasspath.bat)

注意:上述set指令是一個完整的DOS指令,不要随便加Enter鍵,否則會報錯。

在指令行視窗中把目錄切換到ImprovedHibernate下,運作此批處理檔案。由于前面的com\abc和com\abc\people目錄都是放置在此目錄下的,是以在此目錄下執行javac和java指令時,CLASSPATH中的目前目錄就是此目錄。這樣User類等都可以被正确地加載。用如下的指令來編譯TestHibernate.java。

javac com\abc\TestHibernate.java

這樣在com\abc目錄下就生成了TestHibernate.class檔案。運作用如下的指令:java com.abc.TestHibernate(寫類的全名)。運作前别忘了開啟SQL Server服務。我們可以看到在一長串的日志之後,程式運作的結果如下:

<a href="http://blog.51cto.com/attachment/201112/094447569.jpg" target="_blank"></a>

成功運作了。

(後記:十分感謝博友MJ007關于圖檔顯示問題的提醒。此問題已解決。歡迎各位博友多提建設性建議,謝謝!)

本文轉自 NashMaster2011 51CTO部落格,原文連結:http://blog.51cto.com/legend2011/747483,如需轉載請自行聯系原作者