1. 程式人生 > >Hibernate 連接訪問多個數據庫(含訪問不同數據庫的相同表)(轉)

Hibernate 連接訪問多個數據庫(含訪問不同數據庫的相同表)(轉)

手指 row 測試 ransient cat 接口 ava 針對 pos

利用hibernate訪問不同數據庫中的不同表或不同數據庫中的相同表。

本人在開發過程中的解決方案,希望大家交流。
一般用myEclipse工具會自動生成Hibernate的相關文件,大致有下面幾類:

(1)數據庫配置文件:.cfg.xml
(2)映射文件.hbm.xml
(3)映射類:pojo
(4)會話工廠類:SessionFactory
(5)基礎DAO接口:IBaseHibernateDAO
(6)DAO接口的實現基礎類:BaseHibernateDAO
(7)數據訪問對象:DAO。所有DAO默認繼承BaseHibernateDAO

當然,不同的工具生成的文件也略有差異,但不影響實現思路。


一般工具生成的配置只針對一個數據庫,所以都生成了一個數據庫配置文件。
下面我以訪問不同數據庫中相同的表做例子,訪問不同數據庫的不同表原理類同。
假設有兩個數據庫db1和db2,兩個庫中都有user表,要實現對兩個數據庫中的表訪問,操作如下:

(1)配置兩個數據庫配置文件:db1.cfg.xml和db2.cfg.xml,分別連接兩個數據庫。
(2)配置兩個SessionFactory:SessionFactory_db1綁定db1.cfg.xml,SessionFactory_db2,綁定db2.cfg.xml。
(3)基礎DAO接口:IBaseHibernateDAO保持不變,代碼默認如下
public interface IBaseHibernateDAO {

public Session getSession( );

}

(4)DAO接口的實現基礎類:BaseHibernateDAO改造後如下:


public class BaseHibernateDAO implementsIBaseHibernateDAO {

private String dbName;//要連接的數據庫

// 為了保證每個DAO能夠正確指定所操作的數據庫,將無參構造設為私有
private BaseHibernateDAO() { }

// 指定目標數據庫的DAO構造方法
public BaseHibernateDAO(StringdbName) {
this.dbName = dbName;

}

//重寫getSession()方法,使之能夠訪問不同的數據庫
public Session getSession() {
if (dbName == null) {
return null;
}else if (dbName.equals("db01")){
returnSessionFactory_db01.getSession();//連接db01庫
} else if (dbName.equals("db02")) {
returnSessionFactory_db02.getSession();//連接db02庫
} else {
return null;
}
}
}

(5)改造自動生成用戶表對應的DAO——UserDAO類:即繼承父類BaseHibernateDAO的有參構造。

public class UserDAOextends BaseHibernateDAO {

//因為父類將無參構造設置為了private,所以該類只能存在有參構造了。
public UserInfoTbDAO(StringdbName) {
super(dbName);
}

//以下是自動生成的代碼:
public void save(UserTb transientInstance){
try {
getSession().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
}

(6)應用層的測試

public voidtestSaveUser(UserTb user){

UserDAO userDao_1 = newUserDAO("db01");//得到db01庫的DAO
UserDAO userDao_2 = new UserDAO("db02");//得到db02庫的DAO

//假設兩個庫中的數據要同步更新(實際操作中應該加入事務控制)
userDao_1.save();//更新01庫
userDao_2.save();//更新02庫

}

(7)總結:
優點:
1.代碼改動比較小,能充分利用工具生成的代碼。
2.結構簡單,訪問靈活。
3.訪問不同庫的同一個表,只需一個DAO,一個pojo,無需寫額外代碼。

缺點:
1.每次連接數據庫時都要指定訪問的數據庫。
2.為了有效指定數據庫邏輯名,和利於維護,就得“db01”這樣的字符串設置為全局的final變量,或者弄

一個DAO工廠來產生不同的DAO實例。

另一種方法:
上面的方法是改造了DAO的構造方法。也可以改造getSession()方法,這樣透明度更高,但略欠靈活。

本人剛剛接觸Hibernate,不知以上設計是否妥當,望高手指點一二。

Hibernate 連接訪問多個數據庫(含訪問不同數據庫的相同表)(轉)