相對微軟的linq-to-sql或EF框架而言,"Hibernate對於eclipse的集成開發“ 新手並不容易掌握,下面是新手上路的步驟:
一、准備工作:
1、先下載eclipse (官網 http://eclipse.org/) 注:如本機已經安裝了eclipse,可跳過
2、下載Hibernate 最新版本(目前已經到了4.X版本) (官網 http://hibernate.org/ )
3、根據你的db使用情況,下載對應的jdbc驅動包(本文使用的是oracle,本機安裝完oracle client后就能找到)
4、下載commons-logging.jar包(Hibernate內部記錄日志用的是它) (官網 http://commons.apache.org/logging/ )
5、在數據庫里先創建一個測試表TMP_EMP (雖然Hibernate推薦 先設計DomainModel->再持久化到db,但是實際開發中,往往是先有表結構,再開始寫代碼的,所以還是以大多數人習慣的方式為准)
--先創建表 -- Create table create table TMP_EMP ( ID NUMBER(10) not null, NAME VARCHAR2(50), BIRTHDAY DATE, SEX CHAR(1), SALARY NUMBER(8,2) ); -- Add comments to the columns comment on column TMP_EMP.ID is '主鍵ID'; comment on column TMP_EMP.NAME is '姓名'; comment on column TMP_EMP.BIRTHDAY is '日期'; comment on column TMP_EMP.SEX is '性別(F女,M男)'; comment on column TMP_EMP.SALARY is ' 工資'; -- Create/Recreate primary, unique and foreign key constraints alter table TMP_EMP add constraint PK_TMP_EMP_ID primary key (ID); -- 創建Sequence序列 create sequence SQ_TMP_EMP minvalue 1 maxvalue 9999999999999999999999999 start with 201 increment by 1 cache 200;
6、安裝Hibernate Tools 插件(理論上講,這一步可以不用,但是沒這個插件,就只能純手動編寫各種hibernate配置xml了)
啟用eclipse后,如果File->New 能找到Hibernate的相關選項,說明你的機器已經安裝好了Hibernate Tools,可跳過本步驟

否則,Help->Eclipse Marketplace

Find欄輸入Hibernate,就能聯網找到相關的下載地址:

二、創建一個常規的java project,命名為HelloHibernate
創建過程中,注意導入所需的jar包,這些jar包可分為三大類:Hibernate解壓目錄中lib\required下的jar包、jdbc數據庫驅動包、common-logging.jar日志工具包

三、創建Hibernate配置文件(hibernate.cfg.xml)

如果之前沒有配置過其它db連接,可以點擊Get Values from Connection,創建一個連接

設置相關的參數,如果沒問題的話,可以點擊Test Connection測試下參數是否正常

把這個連接,命名myConn后保存,這時再點擊"Get Values from Connection",在彈出的對話框里,就能看到剛才創建的連接myConn


其實這一系列操作,無非就是為了讓ide幫我們生成下面這份xml:
<?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">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="hibernate.connection.password">密碼</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@//服務器IP:1521/orcltest</property>
<property name="hibernate.connection.username">用戶名</property>
<property name="hibernate.default_schema">默認Schema</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
</session-factory>
</hibernate-configuration>
里面記錄了數據庫連接的一些關鍵信息,所以hibernate運行時,就能根據這些信息,知道如何去連接db,以及如何生成sql.
弄好這一步后,還可以在Hibernate Configurations面板里驗證一下db連接是否正常,參考下圖:Window->Show View->Other

輸入hiber,應該就能自動過濾出想要的記錄,選中Hibernate Configurations

然后在eclipse里,就能找到這個面板,展開Database,如果一切順利,應該能自動列出相應的表名

四、創建反向工程配置文件(hibernate.reveng.xml),自動根據表結構,生成實體類
ORM中:通常一個表對應的就是一個類,如果所有類都要手動編寫代碼,要累死人的,幸好hibernate tools提供了"根據db表結構反向生成實體類"的功能
參考下圖,創建一個 Hibernate Reverse Engineering File

參考下圖,點擊Refresh,先把所有表列出來,這里出於演示,我們只把測試表TMP_EMP包含進來(即只處理這一張表)

完成之后,可以看到還有其它很多選擇,點擊"Tables & Columns"

把TMP_EMP給Add進來

類似的,這些圖形化的操作,其實就是要生成一段xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd" > <hibernate-reverse-engineering> <table-filter match-name="TMP_EMP" /> <table name="TMP_EMP"> <column name="ID"></column> <column name="NAME"></column> <column name="BIRTHDAY"></column> <column name="SEX"></column> <column name="SALARY"></column> </table> </hibernate-reverse-engineering>
該xml的內容,相當於db表結構的元數據,有了它,hibernate就能知道:每張表(及表里的每個字段)如何生成java中的類(及類的成員)
下面就讓這些配置run起來,參考下圖:(這個很坑,貌似在菜單里找不到,只能在工具欄里點擊,而且還隱藏一個下拉菜單里)
注:如果工具欄里沒有顯示這個按鈕,可以 window -> Customize Perspective,切換到Command Groups Availablity標簽頁,把Hibernate Code Generation給勾選上

這時,會彈出Hibernate的代碼生成配置界面,比較重要的是:代碼生成的輸出目錄(output directory),以及選擇剛才創建的 reveng.xml(不選這個,hibernate就不知道要生成哪些表,以及生成的規則)

在Exporters面板里,通常我們只需要生成Domain Code(即:實體類),勾中

有時,生成java類后,eclipse不會自動刷新文件結構,建議下面這個也勾上

最后點擊Run,順利的話,就能看到新生成的java類

五、生成hibernate映射配置文件
剛才創建的反向工程配置文件,在運行時其實沒多大作用,它只是用來告訴hiernate如何根據表結構生成java實體類,對於已經存在的java類(比如純手寫的),運行時,hibernate如何知道它對應於db中哪張表呢?答案還是配置文件,參考下圖,創建Hibernate XML Mapping file(即hbm文件)

選擇實體類所對應的包(或某個具體的類)


一路Next,直到完成,這樣我們就得到了文件:TmpEmp.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Dec 26, 2012 1:44:52 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="domain.TmpEmp" table="TMP_EMP">
<id name="id" type="long">
<column name="ID" />
<generator class="assigned" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="birthday" type="java.util.Date">
<column name="BIRTHDAY" />
</property>
<property name="sex" type="java.lang.Character">
<column name="SEX" />
</property>
<property name="salary" type="java.math.BigDecimal">
<column name="SALARY" />
</property>
</class>
</hibernate-mapping>
這面就記錄了每個java類與表之間的映射關系,最后一步配置相關的操作:
生成hbm文件后,hibernate如何知道去讀這個文件呢?我們總得給hibernate一些提示吧,雙擊hibernate.cfg.xml文件,找到Mappings節點,如下圖:

點擊add,把剛才創建的TmpEmp.hbm.xml給添加進來

保存之后,你會發現,其實無非就是在hibernate.cfg.xml里,自動加了一行:
<mapping resource="domain/TmpEmp.hbm.xml"/>
最后來玩一把:創建一個帶main方法的類
package app;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import domain.TmpEmp;
import java.util.List;
public class Hello {
/**
* @param args
*/
public static void main(String[] args) {
Session ss = getSession();
List result = ss.createQuery("from TmpEmp").list();
for (TmpEmp t : (List<TmpEmp>) result) {
System.out.println("Id:" + t.getId() + ",Name:" + t.getName());
}
ss.close();
}
static SessionFactory sessionFactory;
static Session getSession() {
if (sessionFactory == null) {
sessionFactory = new Configuration().configure().buildSessionFactory();
}
return sessionFactory.openSession();
}
}
這里只演示了最簡單的查詢,順利的話,Console面板里,就應該有結果了(如下圖)

注:Hibernate升級到4以后,原來的buildSessionFactory()方法在eclipse里會提示“過時”,最新4.3版hibernate下的正確寫法為:
1 private static SessionFactory factory; 2 3 public static SessionFactory getFactory() { 4 Configuration configuration = new Configuration().configure(); 5 StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder() 6 .applySettings(configuration.getProperties()); 7 StandardServiceRegistryImpl registry = (StandardServiceRegistryImpl) builder 8 .build(); 9 factory = configuration.buildSessionFactory(registry); 10 11 return factory; 12 13 } 14 15 public static Session getSession() { 16 return factory.openSession(); 17 }
使用上述代碼前,先import下面這幾個package
1 import org.hibernate.Session; 2 import org.hibernate.SessionFactory; 3 import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 4 import org.hibernate.boot.registry.internal.StandardServiceRegistryImpl; 5 import org.hibernate.cfg.Configuration;
