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

Hibernate 連線訪問多個數據庫(含訪問不同資料庫的相同表)

利用訪問不同資料庫中的不同表或不同資料庫中的相同表。

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

1)資料庫配置檔案:.cfg.xml
2)對映檔案.hbm.xml
3)對映類:pojo
4)會話工廠類:SessionFactory
5)基礎DAO介面:IBaseHibernateDAO
6DAO介面的實現基礎類:BaseHibernateDAO
7)資料訪問物件:DAO。所有DAO預設繼承BaseHibernateDAO

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

一般工具生成的配置只針對一個數據庫,所以都生成了一個數據庫配置檔案。

下面我以訪問不同資料庫中相同的表做例子,訪問不同資料庫的不同表原理類同。假設有兩個資料庫db1db2,兩個庫中都有user,要實現對兩個資料庫中的表訪問,操作如下:

1)配置兩個資料庫配置檔案db1.cfg.xmldb2.cfg.xml,分別連線兩個資料庫。2)配置兩個SessionFactorySessionFactory_db1繫結db1.cfg.xmlSessionFactory_db2,繫結db2.cfg.xml3)基礎DAO介面IBaseHibernateDAO保持不變,程式碼預設如下
public interface IBaseHibernateDAO {
public Session getSession( );

}

4DAO介面的實現基礎類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 連線訪問個數(訪問不同資料庫相同)

利用訪問不同資料庫中的不同表或不同資料庫中的相同表。 本人在開發過程中的解決方案,希望大家交流。一般用myEclipse工具會自動生成Hibernate的相關檔案,大致有下面幾類: (1)資料庫配置檔

Hibernate 連接訪問個數(訪問不同相同)(轉)

手指 row 測試 ransient cat 接口 ava 針對 pos 利用hibernate訪問不同數據庫中的不同表或不同數據庫中的相同表。 本人在開發過程中的解決方案,希望大家交流。一般用myEclipse工具會自動生成Hibernate的相關文件,大致有下面幾類:

訪問Access數(有個數時 體現態)

.sh into img 保留 tag int32 無效 要求 oledb 如果想編寫單機版MIS、小型網站等對數據庫性能要求不高的系統,又不想安裝SQLServer,可以使用Access(MDAC),只要一個mdb文件就可以了。使用Access創建mdb文件,建表。Ole

Laravel框架實現同時連線個數

laravel4.2版本, 1.修改配置檔案:config/database.php 'pgsql' => array( 'driver' => 'pgsql', 'host' => '10.0.2.203', 'database'

Mybatis連線個數配置方法

注意:本文配置不涉及Spring,僅限於Mybatis內。 思路: 1、configuration.xml配置檔案中environments內參數寫成動態傳參; 2、DBUtil類中構建SQLSessionFactory時讀取傳入的資料庫連線配置資訊動態生成。 案例如下: 1)c

grails3.0.9 連線個數

grails 連結多個數據庫的時候: 注意的地方:  1、格式要對齊  2、dialect必須寫正確  3、採用多個數據源,可以在最頂層寫,寫可以寫在environments裡,同時也可以在兩

TP5 連線SQLServer資料庫個數切換

phpstudy  php版本5.5.38  TP5.0 1.配置database.php //db1 // 伺服器地址 'hostname' => '127.0.0.1', // 資料庫名 'databa

Spring+jpa連線個數

1.persistence.xml<?xml version="1.0" encoding="UTF-8"?><persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="

使用Flask_SQLAlchemy連線個數

#!/usr/bin/env python #-*- coding: utf-8 -*- from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 配置多個數據庫連線 SQL

jfinal 個數連線及使用

有時根據專案需要,我們要連線多個數據,如db1 ,或db2,分別對應不同的ip地址及資料庫名稱, jfinal 對於這樣的要求,有自己的一套方案,需要進行如下配置。 public void configPlugin(Plugins me) { PropKit.use("con

單個工程中Spring+Mybatis連線個數的配置(個人分享版本)

上一篇部落格說到同一個問題,經過和朋友的研究已經參考網上的資料,現在給出一份更簡潔的配置。 情景:現在單個工程中需要連線兩個庫,這兩個庫在同一個mysql中,兩個庫都需要進行讀寫。 解決: 第一步:將spring和mybatis整合,這個過程就不具體演示了,在這個過程中建立

一個專案中hibernate框架下配置個數

hibernate框架下配置多個數據庫 當我們在同一個專案中需要同時連線多個數據庫時,在hibernate框架下的我們可以通過配置多個sessionFactory與多個連線池配置實現獲取不同資料庫的連線session物件。 初始化hibernate的se

django配置連線個數,和把應用名字在admin後臺顯示為中文

在專案tt下新建兩個app,分別為app01、app02。配置app01使用default節點資料庫;app02使用hvdb節點資料庫(也可以配置app01下的model既使用default,也可以使用hvdb資料庫)1.編輯settings.py,新增多個數據庫:DATAB

springboot連線個數

今天借到一個新的需求,需要把自己資料庫某個表的資料遷移到別的資料庫中,於是百度,中間出現了一些細節的問題,解決花了點時間,在此記錄一下,下次避免出現過的錯誤 這裡把連線一個數據庫的情況也記錄一下,好做對比 一、連線一個數據庫 1.啟動類 @SpringBootAppl

ThinkPHP 3.2 連線個數使用(M、D)操作說明

<?php /** * 配置檔案 */ return array( // 預設連線資料庫 'DB_TYPE' => 'mysql', // 資料庫型別 'DB_H

ci高階用法篇之連線個數

在我們的專案中有時可能需要連線不止一個數據庫,在ci中如何實現呢? 我們在本地新建了兩個資料庫,如下截圖所示: 修改配置檔案database.php檔案為如下格式(讀者根據自己資料庫的情況修改相應引數的配置): <?php defined('BASEPATH')

phalcon 連線個數 phalcon multi-database

http://stackoverflow.com/questions/22197678/how-to-connect-multiple-database-in-phalcon-framework //This service returns a MySQL databa

django 對個數支持

django 多數據庫 數據庫自動路由使用多數據庫最簡單的方法是建立一個數據庫路由模式。默認的路由模式確保對象’粘滯‘在它們原始的數據庫上(例如,從foo 數據庫中獲取的對象將保存在同一個數據庫中)。默認的路由模式還確保如果沒有指明數據庫,所有的查詢都回歸到default數據庫中。你不需要做任何事情來

YII2 gii 配置個數, 或者個配置文件的時候 gii 出現數不存在, 實現選擇數 Table '****' does not exist. 解決 就在gii 頁面 選擇數選項

TP 實現 分享 inf 技術 bsp 多個 ble png 用著用著就暈了 就在gii 頁面 選擇數據庫選項 (配置多個數據庫後制動就該有選項) YII2 gii 配置多個數據庫, 或者多個配置文件的時候 gii 出現數據表不存在, 實現選擇數據庫 Table

SpringBoot(三)通過properties實現個數環境自動切換配置

方式 info 本地 所有 -c int 安裝 style 過多 前面的文章已經介紹了CentOS部署SpringBoot項目從0到1的詳細過程,包括Linux安裝ftp、Tomcat以及Java jdk的全部過程。這篇文章主要介紹關於springboot如何通過多