hibernate 動態多資料庫,hibernate資料庫

來源:互聯網
上載者:User

hibernate 動態多資料庫,hibernate資料庫
最近老師給了一個任務,需求是這樣的
伺服器A上有一張表,裡面存放了若干個伺服器的資訊,表的欄位包括:

    private int id;    private String serverName;    private String host;    private String userName;    private String passWord;
我們要通過讀取A資料庫上的伺服器資訊,去對應的資料庫裡獲得資料。

首先咱們分析一下這個問題,多資料庫對hibernate來說不是難事,網上資料有很多,例如:
Hibernate訪問多個資料庫
但是網上的大多數例子都和上面那篇部落格一樣,是事Crowdsourced Security Testing道有幾個資料庫,每個庫的資訊,然後手動產生xml。

可是我們的需求是,在程式啟動並執行時候才知道到底有幾個資料庫。
事先產生xml的路是走不通的。

這時,我想能不能每次我在對伺服器A裡面的那張表進行增刪改的時候,用dom4j的方式自動產生xml?
最後的結論是太複雜。 捨棄。

難道hibernate就只能從xml開始?
當然不,還可以從hibernate.properties開始嘛。
properties和xml都是檔案嘛,說了等於沒說。

不,難道親們忘了,java.util.Properties這個類麼?
請參考  Hibernate入門 :不使用hibernate.cfg.xml


上面面有一個東西我比較不爽
//建立映射(只需要指定Class對象,自動搜尋對應檔)
如果hibernate與spring配合使用
    <bean id="sessionFactory"        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">        <property name="dataSource">            <ref bean="dataSource" />        </property>        <property name="packagesToScan">            <list>                <value>com.core.model</value>            </list>        </property>    </bean>
還可以有packagesToScan這個屬性掃描一下。
現在 只能一個一個加addClass了。

ok現在我們來看看代碼
再hibernate得使用中,我們會抽象出UtilDAO這個類。
package com.core.dao;@Componentpublic class UtilDAO extends HibernateDaoSupport {    protected void initDao() {        // do nothing    }    public void save(Object transientInstance) {        try {            getHibernateTemplate().save(transientInstance);            // log.debug("save successful");        } catch (RuntimeException re) {            // log.error("save failed", re);            throw re;        }    }        public void update(Object transientInstance) {        try {            getHibernateTemplate().update(transientInstance);            // log.debug("save successful");        } catch (RuntimeException re) {            // log.error("save failed", re);            throw re;        }    }    public List<?> findAllList(String entity){        try {            String queryString = null;            queryString = "from "+entity;            return getHibernateTemplate().find(queryString);        } catch (RuntimeException re) {            // log.error("find by property name failed", re);            throw re;        }    }        public void delete(Object transientInstance){        try {            getHibernateTemplate().delete(transientInstance);            // log.debug("save successful");        } catch (RuntimeException re) {            // log.error("save failed", re);            throw re;        }    }       @Resource    public void setSessionFactory0(SessionFactory sessionFactory){          super.setSessionFactory(sessionFactory);      }}
看最後一個方法setSessionFactory0,將我們用Properties類產生的sessionFactory注入即可。

我們實現多資料庫查詢的方法如下:
    @SuppressWarnings("unchecked")    public String getTreeFromRemote(){        UtilDAO _utilDAO=new UtilDAO();        JSONArray ja=new JSONArray();        List<Server> servers=(List<Server>) utilDAO.findAllList("Server");  //Server就是最開始說的那個Server        for (Server server : servers) {            _utilDAO=Hibernate3WithoutConfig.getUtilDAO(server);            ja.add(getAPPTree(_utilDAO,server.getServerName()));        }        System.out.println("_________");        System.out.println(ja);        return SUCCESS;    }
在資料庫中,我們有一個Server表。

如下:


至於getAPPTree,就不給大家示範了,已經有了utildao了,而且這個utildao就是server.getServerName()對應的那個資料庫的dao 剩下的事情還需要我說嘛?
對了 還有一個:
Hibernate3WithoutConfig.javapublic static UtilDAO getUtilDAO(Server s){        Properties p = new Properties();        p.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");        p.put("hibernate.connection.url", "jdbc:mysql://"+s.getHost()+"/WG?useUnicode=true&characterEncoding=UTF-8");        p.put("hibernate.connection.username", s.getUserName());        p.put("hibernate.connection.password", s.getPassWord());        p.put("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect");        p.put("hibernate.hbm2ddl.auto","update");        p.put("hibernate.current_session_context_class", "thread");        p.put("hibernate.show_sql", "true");                Configuration conf = new AnnotationConfiguration().setProperties(p);        conf.addClass(User.class);  //這幾個類是我需要用的class        conf.addClass(Collection.class);        conf.addClass(Groups.class);        conf.addClass(Item.class);                SessionFactory sf = conf.buildSessionFactory();        UtilDAO utilDAO=new UtilDAO();        utilDAO.setSessionFactory0(sf);        return utilDAO;            }


在做這塊的時候,必然要從本機串連到別的伺服器上,開啟mysql的遠端存取許可權是比不可少的。
網上的資料也有很多
ERROR 2003 :Can't connect to MySQL server on 10.150.0.83 (10038)
出現上面的問題讓我頭疼了很長時間,最後師兄說了一句:你把遠程伺服器的防火牆關了沒?
然後問題解決了。



參考資料

http://developer.51cto.com/art/200907/133239.htm

http://blog.csdn.net/xiazdong/article/details/7562765

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.