• hibernate 动态多数据库


    近期老师给了一个任务,需求是这种
    serverA上有一张表,里面存放了若干个server的信息,表的字段包含:
        private int id;
        private String serverName;
        private String host;
        private String userName;
        private String passWord;
    我们要通过读取A数据库上的服务器信息,去相应的数据库里获得数据。

    首先咱们分析一下这个问题,多数据库对hibernate来说不是难事,网上资料有非常多,比如:
    Hibernate訪问多个数据库
    可是网上的大多数样例都和上面那篇博客一样,是事先知道有几个数据库,每一个库的信息,然后手动产生xml。



    但是我们的需求是,在程序执行的时候才知道究竟有几个数据库。
    事先产生xml的路是走不通的。

    这时,我想能不能每次我在对serverA里面的那张表进行增删改的时候,用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;
    
    @Component
    public 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.java
    public 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;
            
        }


    在做这块的时候,必定要从本机连接到别的server上,开启mysql的远程訪问权限是比不可少的。
    网上的资料也有非常多
    ERROR 2003 :Can't connect to MySQL server on 10.150.0.83 (10038)
    出现上面的问题让我头疼了非常长时间,最后师兄说了一句:你把远程server的防火墙关了没?
    然后问题攻克了。



    參考资料

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

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

  • 相关阅读:
    20210805-接口测试实战(持续更新中···)
    2021-07-06:关于自动化测试
    学习记录-更新时间-2021-04-09
    知识点@解决端口被占用的问题
    PS学习笔记
    JS去掉数组中重复的数
    验证码倒计时
    统计数组中出现最多的字母及次数
    验证码倒计时js
    小兔鲜css
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7130884.html
Copyright © 2020-2023  润新知