Hibernate 作為一款經典的 Java 持久層框架,其核心優勢在於將資料庫結構封裝為普通 Java 物件(POJO),讓開發者能像操作記憶體物件一樣存取資料,從而將精力集中在業務邏輯實現上。本文將透過一個完整的實戰案例,詳細講解 Hibernate 2.1 時代的環境搭建、實體類映射、關聯關係處理以及 SessionFactory 配置等核心知識點。
本範例採用的經典技術棧包括:J2SDK 1.4.2、Tomcat 4.1.27、Eclipse 3.0 以及 Hibernate 2.1。雖然版本較早,但其核心架構思想在現代 Hibernate/JPA 版本中依然延續。
範例涉及三張表:Users(用戶表)、Address2(地址表)與 Contacts(聯繫人表)。其中 Users 與 Contacts 透過外鍵 User_ID 建立一對多關聯。
create table Users (
LogonID VARCHAR(255) not null,
EmailAddress VARCHAR(255),
LastLogon DATE,
Password VARCHAR(255),
Name VARCHAR(255),
primary key (LogonID)
);
create table Address2 (
ID VARCHAR(255) not null,
City VARCHAR(255),
State VARCHAR(255),
Zip VARCHAR(255),
primary key (ID)
);
create table Contacts (
ID BIGINT not null,
EmailAddress VARCHAR(255),
Name VARCHAR(255),
User_ID VARCHAR(255),
primary key (ID)
);
alter table Contacts add constraint FKE207C4735A7381EF foreign key (User_ID) references Users;
create index IXE207C4735A7381EF on Contacts (User_ID);
安裝 Hibernate Eclipse 插件後,繁瑣且易錯的映射文件(.hbm.xml)與配置文件可自動生成。開發者的核心任務轉向實現 DAO(Data Access Object)層。針對每張表,工具會生成基礎 DAO 類(如 BaseAddress2DAO、ContactsDAO、UsersDAO),開發者在此基礎上擴充業務邏輯。
實體類 Users、Contacts、Address2 對應資料表。因 Users 與 Contacts 為一對多關係,Users.java 中以 Set 集合屬性持有 Contacts 物件,並提供雙向維護方法:
private java.util.Set _contactsSet;
public java.util.Set getContactsSet() {
return this._contactsSet;
}
public void setContactsSet(java.util.Set _contactsSet) {
this._contactsSet = _contactsSet;
}
public void addToContactsSet(Object obj) {
if (null == this._contactsSet) this._contactsSet = new java.util.HashSet();
this._contactsSet.add(obj);
}
Hibernate 連接資料庫主要有兩種方式:使用 Web 容器提供的連接池(JNDI DataSource),或自行配置連接參數。本文採用後者,配置文件 hibernate.cfg.xml 關鍵點如下:
net.sf.hibernate.dialect.SQLServerDialect,確保生成符合目標資料庫的 SQL。hibernate.show_sql 設為 false(開發調試時建議開啟)。hibernate.use_outer_join 開啟以優化關聯查詢。<mapping resource="..." /> 載入各實體的 .hbm 文件。<hibernate-configuration>
<session-factory>
<!-- local connection properties -->
<property name="hibernate.connection.url">
jdbc:jtds:sqlserver://192.198.64.168:1433;databasename=test;SelectMethod=Cursor
</property>
<property name="hibernate.connection.driver_class">
net.sourceforge.jtds.jdbc.Driver
</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password">sasa</property>
<!-- 數據庫方言 -->
<property name="dialect">
net.sf.hibernate.dialect.SQLServerDialect
</property>
<property name="hibernate.show_sql">false</property>
<property name="hibernate.use_outer_join">true</property>
<!-- mapping 文件-->
<mapping resource="com/head/multi/Contacts.hbm" />
<mapping resource="com/head/multi/Users.hbm" />
<mapping resource="com/head/multi/Address2.hbm" />
</session-factory>
</hibernate-configuration>
Set 避免重複,並提供 add/remove 便利方法維護雙向關係一致性。掌握上述流程,即可快速搭建基於 Hibernate 的持久層基礎設施,為後續業務開發奠定堅實基礎。