hibernate(以下簡稱hiber)的第一編學習終於結束了。學習的過程中,總結出來一些經驗及學習的筆記,特拿出來與大家共享之,由於我能力有限,不能對hiber做到精通,所以還請大家鑒別,如發現有什麼錯誤,還望不吝指教,在此謝謝各位達人的斧正。學hiber的過程中,我買了本書:《深入淺出hibernate》,夏昕,曹曉剛,唐勇合著的,自我感覺書寫的不錯,真正的做到了深入淺出。但不足之處鄙人覺得事例太少,實戰不佳。需要大家自己多想辦法來實現一些應用,只有這樣才能真正的體會其中之精髓,為己所用。
剛接觸hiber的時候,在網上找了篇如何學習hiber的文章,認真品讀後,牢記作者說的不能為了學習hiber而學習,而應該從更高層次的去理解它的內涵。這篇文章咱jr上也有http://www.javaresearch.org/article/24993.htm,大家在學習的時候可以看看。
hiber的主要任務是實現數據的持久層操作,而何謂持久層?可以理解為:在系統邏輯的層面上,專注於實現數據持久化的一個相對獨立的領域。hiber所要完成的是實現在這個領域中的數據操作,而這個完成並不是一般的只要實現最終目的就算完成的完成,它所追求的性能消耗小,耦合度小,數據封裝性強等等才是它真正意義上的完成數據的持久層操作。
hiber的基礎配置及使用在此不再多講,如果你准備好了學hiber這些不是你的障礙。下面我們討論真正屬於障礙的部分。hiber的o/r映射o:object,r:relational。放在一起就是對象 關系。而hiher本身應該算是java的面向對象特性與傳統關系型數據之間矛盾的產物。又基於對web及hiber的基礎性了解,那麼o/r映射無疑就成了orm框架中最為關鍵的內容。
在學習or映射之前,我們要先對hiber的基本數據類型有所了解。
實體映射技術作為類與表之間的聯系紐帶,在orm實現中起著至關重要的作用。對於hiber用戶而言,映射關系更多的體現在配置文件的維護過程中。hiber選用xml作為其映射配置文件的好處自不用說,只要對xml知識有所了解,大家就可以體會到這一點。
我們在配置o/r映射的時候,首先是
1.類名與表名的映射,
2.接著是主鍵映射,
3.最後是字段映射。
一個完整o/r映射建立的基礎是數據庫表的存在,然後由數據庫表產生類表映射配置媒介.hbm.xml文件。最後寫出實體類,即由數據庫表映射出來的java類。
我這裡有一份完整的o/r映射,大家可以看一下:
按照上面的步驟,首先有數據庫表:
CREATE TABLE reg (
Id int(6) unsigned NOT NULL auto_increment,
username varchar(16) default NULL,
password varchar(20) default NULL,
phone int(11) default NULL,
email varchar(30) default NULL,
address varchar(50) default NULL,
sex varchar(4) default NULL,
PRIMARY KEY (Id)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
在數據表的基礎上建立.hbm.xml文件:
< ?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">
< hibernate-mapping>
< class name="mypack.Customer" table="reg">
< comment>Users may bid for or sell auction items.< /comment>
< id name="id"
column="id"
type="int">
< generator class="native"/>
< /id>
< property name="username"
not-null="true"
column="username"
type="string"/>
< property name="password"
not-null="true"
column="password"
type="string"
/>
< property name="phone"
not-null="true"
column="phone"
type="string"
/>
< property name="email"
not-null="true"
column="email"
type="string"
/>
< property name="address"
not-null="true"
column="address"
type="string"
/>
< property name="sex"
not-null="true"
column="sex"
type="string"
/>
< /class>
< /hibernate-mapping>
然後再建立實體類:
package mypack;
import java.io.Serializable;
public class Customer implements Serializable{
private int id;
private String username;
private String email;
private String password;
private String phone;
private String sex;
private String address;
public Customer(){}
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getUsername(){
return this.username;
}
public void setUsername(String username){
this.username=username;
}
public String getPassword(){
return password;
}
public void setPassword(String password){
this.password=password;
}
public String getPhone(){
return this.phone;
}
public void setPhone(String phone){
this.phone=phone;
}
public String getEmail(){
return email;
}
public void setEmail(String email){
this.email=email;
}
public String getAddress(){
return this.address;
}
public void setAddress(String address){
this.address=address;
}
public String getSex(){
return this.sex;
}
public void setSex(String sex){
this.sex=sex;
}
}
< class name="mypack.Customer" table="reg">
下面對這份映射文件做個分析:
1.類表應射配置:
< class name="mypack.Customer" table="reg">
name指定了映射類名。
table指定了所對應的數據庫表
2.id映射配置
< id name="id" column="id" type="int">
< generator class="native"/>
< /id>
name指定當前映射類中的屬性:id,它對應了數據庫表reg表中的主鍵字段
column指定了當前映射表reg的唯一標識為id這個字段。
type指定了當前字段的數據類型
generator指定了主鍵的生成方式,關於hiber中的主鍵生成機制這裡有相關的介紹,大家可以看看:http://blog.csdn.net/watano_cc/archive/2006/02/28/612286.aspx
3.屬性/數據庫字段映射配置:
< property name="address"
not-null="true"
column="address"
type="string"/>
相信這個就不用相細介紹了吧?大家看看就明白了[:)]
最後我們說一下路徑問題,.hbm.xml文件默認放在實體類所產生的class文件所在的包中。這樣一個完整的o/r映射就建立了,其實問題的關鍵不在操作本身,而在於思路是否清晰,只要思路清晰,那麼按照別人講給的配置方法,操作肯定能成功。