[原創]Hibernate入門(1)
說明下,我也是新手,我現在的目的是為了快速上手Hibernate(以下簡稱H),因此并沒有作深入研究。
參考資料:《Hibernate_Reference》、《深入淺出Hibernate》
正文
下面我們將創建一個簡單的基于控制臺的(console-based)Hibernate應用程序。
1.1
這里假設你已經擁有了一個數據庫,并且盡量將數據庫中的各種關聯設置完畢,如果你能這樣子做,接下來的事情將會變得非常簡單^_^
打開透視圖(perspective)中的myeclipse database exploer
在里面我們要配置下數據源

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

1.2
一路默認即可,最后將會生成一堆配置的文件一共有3類:
1.持久化類,就是一個帶有一些屬性(property)的簡單JavaBean類如:
你可以看到這個類對屬性的存取方法(getter and setter method)使用了標準JavaBean命名約定,同時把類屬性(field)的訪問級別設成私有的(private)。這是推薦的設計,但并不是必須的。
2.xml映射配置
Hibernate需要知道怎樣去加載(load)和存儲(store)持久化類的對象。這正是Hibernate映射文件發揮作用的地方。映射文件告訴Hibernate它,應該訪問數據庫(database)里面的哪個表(table)及應該使用表里面的哪些字段(column)。
3.Hibernate配置
現在我們已經有了一個持久化類和它的映射文件,該是配置Hibernate的時候了。
這里需要特別指出的是<property?name="show_sql">true</property>
用了這句我們可以直接在ec控制臺看到Hibernate生成的sql語句,對調試程序是相當有幫助的!
示例的基本框架完成了 - 現在我們可以用Hibernate來做些真正的工作。
1.3
我們終于可以使用Hibernate來加載和存儲對象了,編寫一個帶有
我們創建了個新的
一個
HibernateSessionFactory.getSession()是干什么的呢?返回“當前的”工作單元。
getTransaction()則表示取出一個事務對象,commit()則是事務的提交,即將緩存中的數據寫入數據庫。
就是這么面向對象的方法,你就完成了傳統的sql語句的功能,是不是很爽?更爽的是你還可以用hql語言來完成更強大的功能,當然這里不可能一一列舉,只有看書了,請參考《深入淺出Hibernate》P173 ^_^
正文
下面我們將創建一個簡單的基于控制臺的(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;
????}
}
????//?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>
<!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)和應用程序指定(或者你自己為任何已有策略所寫的擴展)這些策略來生成標識符。
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;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>
<!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;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();
????}
}
????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
命令傳給數據庫。在運行之前,讓我們看一下處理Session
和Transaction
的代碼。 一個
Session
就是個單一的工作單元。我們暫時讓事情簡單一些,并假設HibernateSession
和數據庫事務是一一對應的。HibernateSessionFactory.getSession()是干什么的呢?返回“當前的”工作單元。
getTransaction()則表示取出一個事務對象,commit()則是事務的提交,即將緩存中的數據寫入數據庫。
就是這么面向對象的方法,你就完成了傳統的sql語句的功能,是不是很爽?更爽的是你還可以用hql語言來完成更強大的功能,當然這里不可能一一列舉,只有看書了,請參考《深入淺出Hibernate》P173 ^_^
posted on 2007-08-04 20:20 藍色幽默 閱讀(328) 評論(0) 編輯 收藏 所屬分類: Hibernate