hibernate 动态多数据库

网友投稿 581 2022-11-26

hibernate 动态多数据库

hibernate 动态多数据库

最近老师给了一个任务,需求是这样的 服务器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配合使用

com.core.model

还可以有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 servers=(List) 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./art/200907/133239.htm​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:解决mybatis竟然报Invalid value for getInt()的问题
下一篇:Struts的取值与标签
相关文章

 发表评论

暂时没有评论,来抢沙发吧~