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配合使用
<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 动态多数据库的更多相关文章
- hibernate动态创建数据库表名几种方式
数据库中数据量很大, 但又不可以删除时同时又要优化程序检索数据时间. 答:方式有很多比如 创建数据库表分区,创建索引, 存储过程等; 我这里采用动态创建数据库表的方式. 完全可以在不创建表分区情况下实 ...
- java 动态创建数据库和动态连接数据库
项目中有一个需求要动态创建数据库并且要动态连接数据库,本来以为还很难实现呢,在网上找了好久,都不是很理想,最后看到有人说创建数据库时,先连接到任意一个数据库,获得连接后用createStatement ...
- 菜鸟学SSH(十八)——Hibernate动态模型+JRebel实现动态创建表
项目用的是SSH基础框架,当中有一些信息非常相似,但又不尽同样.假设每个建一个实体的话,那样实体会太多.假设分组抽象,然后继承,又不是特别有规律.鉴于这样的情况.就打算让用户自己配置要加入的字段,然后 ...
- 11月10日上午ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库
1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...
- Hibernate连接mysql数据库并自动创建表
天才第一步,雀氏纸尿裤,Hibernate第一步,连接数据库. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个 ...
- hibernate像MySQL数据库里面存值是中文乱码的解决合辑
解决办法一: 1.把数据库表每一行改成gb2312_chinese(使用PHPMyAdmin) 2.导入时候还是不行,因此查网上的资料说hibernate持久化层在传输过程中未设置编码格式,这样在 ...
- Ajax实现在textbox中输入内容,动态从数据库中模糊查询显示到下拉框中
功能:在textbox中输入内容,动态从数据库模糊查询显示到下拉框中,以供选择 1.建立一aspx页面,html代码 <HTML> <HEAD> <title>We ...
- ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库
1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...
- 使用PHP中的ajax做登录页面、验证用户名是否可用、动态调用数据库
1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...
随机推荐
- Zookeeper动态更新服务器列表
-------------------------------------------------------------------------------------- [版权申明:本文系作者原创 ...
- Markdown对应Yelee主题语法
概述 这里说的是Yelee主题的语法和原生语法是有些区别的:更多的基础语法可以到Cmd Markdown上面去查看:但是我觉得都会各有不同吧 注意这里说的不是真正意义上的Markdown语法 标题 一 ...
- 代理IP爬取,计算,发放自动化系统
IoC Python端 MySQL端 PHP端 怎么使用 这学期有一门课叫<物联网与云计算>,于是我就做了一个大作业,实现的是对代理IP的爬取,计算推荐,发放给用户等任务的的自动化系统.由 ...
- Spark技术内幕: 如何解决Shuffle Write一定要落盘的问题?
在Spark 0.6和0.7时,Shuffle的结果都需要先存储到内存中(有可能要写入磁盘),因此对于大数据量的情况下,发生GC和OOM的概率非常大.因此在Spark 0.8的时候,Shuffle的每 ...
- React native和原生之间的通信
RN中文网关于原生模块(Android)的介绍可以看到,RN前端与原生模块之 间通信,主要有三种方法: 1)使用回调函数Callback,它提供了一个函数来把返回值传回给JavaScript. 2)使 ...
- 使用std::vector优化点云动画显示一例
1. 准备 使用std::vector应该知道几点: (1)内存连续的容器,有点像数组 (2)与std::list相比,插入和删除元素比较慢- 因为数据迁移 (3)添加元素可能会引发内存分配和数据迁移 ...
- Effective C++ ——让自己习惯C++
条款一:视C++为一个语言联邦 为了理解C++,你必须认识其主要的次语言.幸运的是总共只有四个: C:C++是由C语言继承而来的,必然对C有很好的兼容性,这一部分主要包括C中的一些语言,库函数等.但当 ...
- Dynamics CRM 视图显示列的拷贝—view layout replicator
在视图设置的时候很多人会遇到这样的问题,要设置多张视图,而这多张视图可能除了筛选条件不同外其他的均相同,手动去设置是件重复的令人非常头痛的事情,如果能够拷贝那就相当完美了. 本篇即介绍视图显示列的拷贝 ...
- java中抽象类的定义和使用
java虽然比较简单,但是细节的知识点还是很多的,现在,介绍一下抽象类的定义和实现基础. 指的是在类中定义方法,而不去实现它,而在它的子类中去具体实现,继承抽象类的子类必须实现父类的抽象方法,除非子类 ...
- Hibernate单表操作
单一主键 assigned:由Java应用程序负责生成(即手工的赋值) native:由底层的数据库自动的生成标示符,如果是MySQL就是auto_increment,如果是Oracle就是seque ...