J度空間

          [原創]Hibernate入門(1)

          說明下,我也是新手,我現在的目的是為了快速上手Hibernate(以下簡稱H),因此并沒有作深入研究。

          參考資料:《Hibernate_Reference》、《深入淺出Hibernate》


          正文

          下面我們將創建一個簡單的基于控制臺的(console-based)Hibernate應用程序。

          我們所做的第一件事就是創建我們的開發目錄,并且把所有需要用到的Java庫文件放進去。萬幸的是我們有了myeclipse,由他創建的工程可以很方便地打包,然后交給另一個同樣擁有myeclipse的使用者,只需要簡單的導入即可使用^_^

          右鍵工程目錄 → myeclipse → Add Hibernate……

          這樣子你的工程就可以導入Hibernate所需要的所有庫文件,接下來我們創建一個類,用來代表那些我們希望儲存在數據庫里的event。


          1.1
          這里假設你已經擁有了一個數據庫,并且盡量將數據庫中的各種關聯設置完畢,如果你能這樣子做,接下來的事情將會變得非常簡單^_^

          打開透視圖(perspective)中的myeclipse database exploer

          在里面我們要配置下數據源



          完成后即可建立連接,然后我們就可以用myec自帶的工具進行映射配置,如下圖:




          1.2

          一路默認即可,最后將會生成一堆配置的文件一共有3類:
          1.持久化類,就是一個帶有一些屬性(property)的簡單JavaBean類如:

          public?abstract?class?AbstractTest?implements?java.io.Serializable?{

          ????
          //?Fields

          ????
          private?Integer?id;

          ????
          private?String?name;

          ????
          private?Set<Testaddr>?testaddr?=?new?HashSet<Testaddr>(0);

          ????
          public?Set<Testaddr>?getTestaddr()?{
          ????????
          return?testaddr;
          ????}

          ????
          public?void?setTestaddr(Set<Testaddr>?testaddr)?{
          ????????
          this.testaddr?=?testaddr;
          ????}

          ????
          /**?default?constructor?*/
          ????
          public?AbstractTest()?{
          ????}

          ????
          /**?full?constructor?*/
          ????
          public?AbstractTest(Integer?id,?String?name)?{
          ????????
          this.id?=?id;
          ????????
          this.name?=?name;
          ????}

          ????
          //?Property?accessors

          ????
          public?Integer?getId()?{
          ????????
          return?this.id;
          ????}

          ????
          public?void?setId(Integer?id)?{
          ????????
          this.id?=?id;
          ????}

          ????
          public?String?getName()?{
          ????????
          return?this.name;
          ????}

          ????
          public?void?setName(String?name)?{
          ????????
          this.name?=?name;
          ????}

          }

          你可以看到這個類對屬性的存取方法(getter and setter method)使用了標準JavaBean命名約定,同時把類屬性(field)的訪問級別設成私有的(private)。這是推薦的設計,但并不是必須的。

          2.xml映射配置

          Hibernate需要知道怎樣去加載(load)和存儲(store)持久化類的對象。這正是Hibernate映射文件發揮作用的地方。映射文件告訴Hibernate它,應該訪問數據庫(database)里面的哪個表(table)及應該使用表里面的哪些字段(column)。

          一個映射文件的基本結構看起來像這樣:


          <?xml?version="1.0"?encoding="utf-8"?>
          <!DOCTYPE?hibernate-mapping?PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD?3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
          >
          <!--?
          ????Mapping?file?autogenerated?by?MyEclipse?Persistence?Tools
          -->
          <hibernate-mapping>
          ????
          <class?name="HibernateFactory.Test"?table="test"
          ????????catalog
          ="himessage">
          ????????
          <id?name="id"?type="java.lang.Integer">
          ????????????
          <column?name="id"?/>
          ????????????
          <generator?class="native"?/>
          ????????
          </id>
          ????????
          <property?name="name"?type="java.lang.String">
          ????????????
          <column?name="name"?not-null="true"?/>
          ????????
          </property>

          ????????
          <set?name="testaddr"?cascade="all"?lazy="false"?inverse="true">
          ????????????
          <key?column="test_id"></key>
          ????????????
          <one-to-many?class="HibernateFactory.Testaddr"?/>
          ????????
          </set>

          ????
          </class>
          </hibernate-mapping>

          hibernate-mapping標簽(tag)之間, 含有一個class元素。所有的持久化實體類(再次聲明,或許接下來會有依賴類,就是那些次要的實體)都需要一個這樣的映射,來把類對象映射到SQL數據庫里的表。

          id元素是標識符屬性的聲明,name="id" 聲明了Java屬性的名字 - Hibernate會使用getId()setId()來訪問它。 column屬性則告訴Hibernate, 我們使用EVENTS表的哪個字段作為主鍵。嵌套的generator元素指定了標識符生成策略,在這里我們指定native,它根據已配置的數據庫自動選擇最佳的標識符生成策略。Hibernate支持由數據庫生成,全局唯一性(globally unique)和應用程序指定(或者你自己為任何已有策略所寫的擴展)這些策略來生成標識符。

          關于具體的配置請參閱《深入淺出Hibernate》P146 數據關聯,所有的參數表請查此書P411

          3.Hibernate配置
          現在我們已經有了一個持久化類和它的映射文件,該是配置Hibernate的時候了。

          <?xml?version='1.0'?encoding='UTF-8'?>
          <!DOCTYPE?hibernate-configuration?PUBLIC
          ??????????"-//Hibernate/Hibernate?Configuration?DTD?3.0//EN"
          ??????????"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
          >

          <!--?Generated?by?MyEclipse?Hibernate?Tools.???????????????????-->
          <hibernate-configuration>

          ????
          <session-factory>
          ????????
          <property?name="show_sql">true</property>
          ????????
          <property?name="connection.username">root</property>
          ????????
          <property?name="connection.url">
          ????????????jdbc:mysql://localhost/himessage?useUnicode=true
          &amp;amp;characterEncoding=utf-8
          ????????
          </property>
          ????????
          <property?name="dialect">
          ????????????org.hibernate.dialect.MySQLDialect
          ????????
          </property>
          ????????
          <property?name="myeclipse.connection.profile">Hb</property>
          ????????
          <property?name="connection.password">1234</property>
          ????????
          <property?name="connection.driver_class">
          ????????????com.mysql.jdbc.Driver
          ????????
          </property>
          ????????
          <mapping?resource="HibernateFactory/Admin.hbm.xml"?/>
          ????????
          <mapping?resource="HibernateFactory/Test.hbm.xml"?/>
          ????????
          <mapping?resource="HibernateFactory/Testaddr.hbm.xml"?/>

          ????
          </session-factory>

          </hibernate-configuration>

          這里需要特別指出的是<property?name="show_sql">true</property>
          用了這句我們可以直接在ec控制臺看到
          Hibernate生成的sql語句,對調試程序是相當有幫助的!

          示例的基本框架完成了 - 現在我們可以用Hibernate來做些真正的工作。

          1.3
          我們終于可以使用Hibernate來加載和存儲對象了,編寫一個帶有main()方法的AdminActionr類:
          public?class?AdminAction?{
          ????
          public?static?void?main(String[]?args)?{
          ????????Session?session?
          =?HibernateSessionFactory.getSession();
          ????????session.beginTransaction();
          ??? ??? Admin?admin?=?new?Admin();
          ??? ??? admin.setEmail("tantan85@163.com");
          ??? ??? admin.setName("tantan");
          ????
          ??? admin.setPsw("111111");
          ??????? admin.setAddAdmin(
          2);
          ????????session.save(admin);
          ????????session.getTransaction().commit();
          ????}
          }

          我們創建了個新的Admin對象并把它傳遞給Hibernate。現在Hibernate負責與SQL打交道,并把INSERT命令傳給數據庫。在運行之前,讓我們看一下處理SessionTransaction的代碼。

          一個Session就是個單一的工作單元。我們暫時讓事情簡單一些,并假設HibernateSession和數據庫事務是一一對應的。
          HibernateSessionFactory.getSession()是干什么的呢?返回“當前的”工作單元。
          getTransaction()則表示取出一個事務對象,commit()則是事務的提交,即將緩存中的數據寫入數據庫。

          就是這么面向對象的方法,你就完成了傳統的sql語句的功能,是不是很爽?更爽的是你還可以用hql語言來完成更強大的功能,當然這里不可能一一列舉,只有看書了,請參考《深入淺出Hibernate》P173 ^_^

          posted on 2007-08-04 20:20 藍色幽默 閱讀(328) 評論(0)  編輯  收藏 所屬分類: Hibernate

          導航

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          統計

          常用鏈接

          留言簿(4)

          隨筆分類

          文章分類

          相冊

          搜索

          最新評論

          主站蜘蛛池模板: 云林县| 个旧市| 高雄县| 长沙市| 贺兰县| 太康县| 南皮县| 北海市| 潞城市| 郧西县| 巴楚县| 玉田县| 砀山县| 木兰县| 射洪县| 长寿区| 永福县| 巴南区| 台江县| 凤凰县| 丰宁| 凯里市| 新建县| 屯留县| 海口市| 大丰市| 英超| 五华县| 铁岭县| 岳阳市| 清流县| 洛川县| 德清县| 庄浪县| 井研县| 兴海县| 牡丹江市| 临澧县| 阆中市| 安顺市| 腾冲县|