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