最近老师给了一个任务,需求是这样的

服务器A上有一张表,里面存放了若干个服务器的信息,表的字段包括:

    private int id;
    private String serverName;
    private String host;
    private String userName;
    private String passWord;

我们要通过读取A数据库上的服务器信息,去对应的数据库里获得数据。



首先咱们分析一下这个问题,多数据库对hibernate来说不是难事,网上资料有很多,例如:

Hibernate访问多个数据库

但是网上的大多数例子都和上面那篇博客一样,是事先知道有几个数据库,每个库的信息,然后手动产生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;

@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;

    }

在做这块的时候,必然要从本机连接到别的服务器上,开启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

hibernate 动态多数据库的更多相关文章

  1. hibernate动态创建数据库表名几种方式

    数据库中数据量很大, 但又不可以删除时同时又要优化程序检索数据时间. 答:方式有很多比如 创建数据库表分区,创建索引, 存储过程等; 我这里采用动态创建数据库表的方式. 完全可以在不创建表分区情况下实 ...

  2. java 动态创建数据库和动态连接数据库

    项目中有一个需求要动态创建数据库并且要动态连接数据库,本来以为还很难实现呢,在网上找了好久,都不是很理想,最后看到有人说创建数据库时,先连接到任意一个数据库,获得连接后用createStatement ...

  3. 菜鸟学SSH(十八)——Hibernate动态模型+JRebel实现动态创建表

    项目用的是SSH基础框架,当中有一些信息非常相似,但又不尽同样.假设每个建一个实体的话,那样实体会太多.假设分组抽象,然后继承,又不是特别有规律.鉴于这样的情况.就打算让用户自己配置要加入的字段,然后 ...

  4. 11月10日上午ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库

    1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...

  5. Hibernate连接mysql数据库并自动创建表

    天才第一步,雀氏纸尿裤,Hibernate第一步,连接数据库. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个 ...

  6. hibernate像MySQL数据库里面存值是中文乱码的解决合辑

    解决办法一: 1.把数据库表每一行改成gb2312_chinese(使用PHPMyAdmin)   2.导入时候还是不行,因此查网上的资料说hibernate持久化层在传输过程中未设置编码格式,这样在 ...

  7. Ajax实现在textbox中输入内容,动态从数据库中模糊查询显示到下拉框中

    功能:在textbox中输入内容,动态从数据库模糊查询显示到下拉框中,以供选择 1.建立一aspx页面,html代码 <HTML> <HEAD> <title>We ...

  8. ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库

    1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...

  9. 使用PHP中的ajax做登录页面、验证用户名是否可用、动态调用数据库

    1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...

随机推荐

  1. java实例化对象

    摘要:分享牛,分享牛分享,java类加载机制,java实例化对象,java实例化对象机制,java基础. java是如何实例化对象的呢?以及实例化对象的先后顺序是什么?下面我们以测试的方式说明. 1. ...

  2. Mac小技巧:强制退出程序的六种方法

    原帖地址: http://www.cnbeta.com/articles/175447.htm 1.使用键盘快捷键强制退出处于活跃状态的Mac程序 快捷键:Command+Option+Shift+E ...

  3. 剑指Offer——知识点储备-操作系统基础

    剑指Offer--知识点储备-操作系统基础 操作系统 操作系统什么情况下会出现死锁? 产生死锁的必要条件 (1)互斥条件:即某个资源在一段时间内只能由一个进程占有,不能同时被两个或两个以上的进程占有, ...

  4. Linux中查看文本文件内容命令cat/tac/nl/more/less/head/tail/vi总结

    概述 在Linux系统下,有很多命令可以查看文本文件的内容,如cat/tac/nl/more/less/head/tail等命令,当然还有vi/nano等文本编辑器.在这里,我只介绍其中自己常用的一部 ...

  5. windows系统下安装和使用ROS的解决方案 (1 win_ros 2 rosserial_windows)

    具体请参考官网: 1  http://wiki.ros.org/win_ros 2  https://github.com/ros-windows/win_ros 3  http://wiki.ros ...

  6. ROS连接ABB机械臂调试详细教程-ROS(indigo)和ABB RobotStudio 6.03.02-

    在ROS industrial介绍中,给出了ROS和常用机械臂的连接方式.具体信息可以参考:http://wiki.ros.org/Industrial ROS连接ABB机械臂调试详细教程-ROS(i ...

  7. Swift中集合类型indexOf(Element)提示错误的解决办法

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 初学Swift,会遇到一些潜在的小问题,比如我们在某个集合对象 ...

  8. SQL Server SA 最佳实践(也许不仅仅是翻译)

    老实说,本文主要部分是翻译的,并且由于英语水平的问题,我没有完全翻译,有些我觉得不重要的就跳过了,目前看来应该八九不离十,或者说不会影响最终效果,对于英语水平好的读者,可以自行查看原文.但这一年里面我 ...

  9. Spark集群模式&Spark程序提交

    Spark集群模式&Spark程序提交 1. 集群管理器 Spark当前支持三种集群管理方式 Standalone-Spark自带的一种集群管理方式,易于构建集群. Apache Mesos- ...

  10. Android的四个基本概念(线程通信和GLSurfaceView)

    GLSurfaceView提供了下列特性: 1> 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上. 2> 管理一个EGL disp ...