hibernate多数据库
⑴ hibernate跨数据库查询
<!-- DataSource -->
以Mysql数据库为例: <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://远程数据库的地址:端口号/数据库名" />
<property name="user" value="远程数据库的用户名" />
<property name="password" value="远程数据库的密码" />
<property name="maxPoolSize" value="100" />
<property name="minPoolSize" value="10" />
<property name="initialPoolSize" value="1" />
<property name="maxIdleTime" value="60" /> <!--单位秒-->
</bean>说白了,就是取得远程数据库的地址、端口号、用户名、密码就可以了。与连接本机区别不大。
⑵ hibernate数据库实现查询两个不同的数据库
配置两个数据源,将两个sessionfactory注入到不同的两个templete中,将两个templete模板再注入到两个中,一个调用模板的get方法取出A库中的学号,根据学号,另一调用get方法取出b库中的数据对象,然后操作A数据库的调用sava或者savaorupdate插入到A库,主要配置好hibernate+spring整合的配置文件
⑶ hibernate如何支持多数据库
一个sessionFactory对应一个数据库 配置多个不同名的sf 写一个容器管理他们
⑷ NHibernate 连接多数据库怎么配置
在开发一些项目时,会使用到多个数据库。例如类A保存在数据库A,类B保存在数据库B。NHibernate在BuildSessionFactory之后,ISessionFactory就不能改变数据库的连接,即是说一个ISessionFactory只能对应一个数据库连接。但NHibernate可以在同一个应用中实例化多个ISessionFactory。实例化多个ISessionFactory,并让类A或类B找到自己所对应的ISessionFactory,获取ISession,即可实现多数据库连接。
如何通过类型获取ISessionFactory呢?ISessionFactory的Statistics.EntityNames中保存了所有映射了的实体类的类名。我们可以判断实体类的类名是否在EntityNames中,确定实体类所对应的ISessionFactory。
根据类型获取ISessionFactory:
java">
{
<TEntity>()whereTEntity:IEntity;
}
:ISessionFactoryHolder
{
privateIDictionary<string,int>entityDictionary;
privateIDictionary<int,ISessionFactory>factoryDictionary;
publicSessionFactoryHolder()
{
this.entityDictionary=newDictionary<string,int>();
this.factoryDictionary=newDictionary<int,ISessionFactory>();
}
#
public<TEntity>()whereTEntity:IEntity
{
inthashCode=0;
Asserts.Assert<MappingException>(
this.EntityInDictionary(typeof(TEntity).FullName,outhashCode)==false
,string.Format("Nopersisterfor:{0}",typeof(TEntity).FullName));
returnthis.factoryDictionary[hashCode];
}
#endregion
(ISessionFactorysessionFactory)
{
Asserts.IsNotNull(sessionFactory,"sessionFactory");
this.factoryDictionary[sessionFactory.GetHashCode()]=sessionFactory;
this.(sessionFactory.Statistics.EntityNames
,sessionFactory.GetHashCode());
}
privateboolEntityInDictionary(stringentityName,outintsessionFactoryHashCode)
{
returnthis.entityDictionary.TryGetValue(entityName,outsessionFactoryHashCode);
}
privatevoid(string[]entityNames,intsessionFactoryHashCode)
{
foreach(varentityNameinentityNames)
{
this.entityDictionary[entityName]=sessionFactoryHashCode;
}
}
}
根据类型获取ISession:
publicinterfaceISessionHolder:IDisposable
{
ISessionGetSessionForEntity<TEntity>()whereTEntity:IEntity;
}
publicclassSessionHolder:ISessionHolder,IUnitOfWork
{
;
privateIDictionary<int,ISession>sessionDictionary;
publicSessionHolder()
{
Asserts.IsNotNull(factoryHolder,"factoryHolder");
this.factoryHolder=factoryHolder;
this.sessionDictionary=newDictionary<int,ISession>();
}
#regionISessionHolderMembers
<TEntity>()whereTEntity:IEntity
{
if(this.sessionDictionary.ContainsKey(this.GetFactoryHashCode<TEntity>())==false)
{
this.sessionDictionary[this.GetFactoryHashCode<TEntity>()]=this.OpenNewSession<TEntity>();
}
returnthis.sessionDictionary[this.GetFactoryHashCode<TEntity>()];
}
#endregion
#regionIDisposableMembers
//DisposeCode
#endregion
#regionIUnitOfWork
//IUnitOfWork
#endregion
<TEntity>()whereTEntity:IEntity
{
returnthis.factoryHolder.GetSessionFactoryForEntity<TEntity>();
}
privateintGetFactoryHashCode<TEntity>()whereTEntity:IEntity
{
returnthis.GetFactory<TEntity>().GetHashCode();
}
privateISessionOpenNewSession<TEntity>()whereTEntity:IEntity
{
returnthis.GetFactory<TEntity>().OpenSession();
}
}
Repository:
publicinterfaceIRepository<TEntity>whereTEntity:IEntity
{
voidSave(TEntityentity);
//......
}
<TEntity>:IRepository<TEntity>whereTEntity:IEntity
{
;
publicNHibernateRepository(ISessionHoldersessionHolder)
{
Asserts.IsNotNull(sessionHolder,"sessionHolder");
this.sessionHolder=sessionHolder;
}
{
get
{
returnthis.sessionHolder.GetSessionForEntity<TEntity>();
}
}
publicoverridevoidSave(TEntityentity)
{
this.Session.Save(entity);
}
//......
}
⑸ Hibernate 怎样 连接2个以上的数据库
<class
name="entity.Person"
table="Person"
schema="dbo"
catalog="hibernate">
用catalog属性设置是那个数据库就可以拉
⑹ java web项目中hibernate +spring +tomcat如何实现多数据库
一下方法只能是同一种数据库, 因为数据库不同的话,数据库方言也就不同,这个暂时解决不了
applicationContext.xml:
<bean id="parentDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- 设置连接池初始值 -->
<property name="initialSize" value="5" />
<!-- 设置连接池最大值 -->
<property name="maxActive" value="5" />
<!-- 设置连接池最小空闲值 -->
<property name="minIdle" value="2" />
<!-- 设置连接池最大空闲值 -->
<property name="maxIdle" value="5" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<value>
<!-- 设置数据库方言 -->
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
<!-- 输出SQL语句到控制台 -->
hibernate.show_sql=true
<!-- 格式化输出到控制台的SQL语句 -->
hibernate.format_sql=true
</value>
</property>
<property name="packagesToScan" value="com.zxw.link.business.**.entity"></property>
</bean>
<bean id="dataSource" class="com.zxw.link.commons.data.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="zxw" value-ref="zxw_DataSource"/>
<entry key="new_back" value-ref="new_back_DataSource"/>
<!--更多的数据源,根据下面的配置文件再写一个datasource 并且在这里配置entry -->
</map>
</property>
<property name="defaultTargetDataSource" ref="zxw_DataSource"/>
</bean>
<bean id="zxw_DataSource" parent="parentDataSource">
<!-- 设置JDBC驱动名称 -->
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<!-- 设置JDBC连接URL -->
<property name="url" value="jdbc:oracle:thin:@148.20.20.17:1521:oradb" />
<!-- 设置数据库用户名 -->
<property name="username" value="zhou" />
<!-- 设置数据库密码 -->
<property name="password" value="zhou" />
</bean>
<!-- #################### 新备份 ################ -->
<bean id="new_back_DataSource" parent="parentDataSource">
<!-- 设置JDBC驱动名称 -->
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<!-- 设置JDBC连接URL -->
<property name="url" value="jdbc:oracle:thin:@148.20.20.15:1521:ora10" />
<!-- 设置数据库用户名 -->
<property name="username" value="report" />
<!-- 设置数据库密码 -->
<property name="password" value="report" />
</bean>
<!-- #################### 新备份 ################ -->
DynamicDataSource .java:
public class DynamicDataSource extends AbstractRoutingDataSource {
protected Object determineCurrentLookupKey() {
// TODO Auto-generated method stub
return CustomerContextHolder.getCustomerType();
}
}
CustomerContextHolder .java:
public class CustomerContextHolder {
private static final ThreadLocal contextHolder =
new ThreadLocal();
public static void setCustomerType(String customerType) {
contextHolder.set(customerType);
}
public static String getCustomerType() {
return (String) contextHolder.get();
}
public static void clearCustomerType() {
contextHolder.remove();
}
}
action中调用
public class ZzhAction {
@Resource
private ZzhService zzhService;
@RequestMapping("/zzh/test.do")
public void test(){
List<Zzh> zzhs=zzhService.getAll();
System.out.println(zzhs.size());
//设置数据源, 参数为配置文件中的
//<entry key="new_back" value-ref="new_back_DataSource"/> 的key
CustomerContextHolder.setCustomerType("new_back");
}
}
⑺ 程序中hibernate怎样实现多个数据库多表互相联查
程序中hibernate怎样实现多个数据库多表互相联查
参考如下
例如:student表和score表需要做联合查询。
1)sql:
select
s.id,s.name,sc.score
from
student
as
s,score
as
sc
where
s.id
=
sc.userId;
(字段都是用的数据库中字段名称)
2)HQL:
select
s.id,s.name,sc.score
from
Student
as
s,Score
as
sc
where
s.id
=
sc.userId;
(上面字段都是
javabean的属性)
如果按1)查询的话,必须调用
session.createSQLQuery();方法
如果按2)查询,还是调用
session.createQuery();
⑻ 基于hibernate 技术的多种数据库管理系统
说的专业,其实就是基于Hibernate的javaweb开发,创建SSH项目,数据库操作使用HIbernate操作
⑼ Hibernate 向数据库一次插入多条数据
把你需要插入的数据全部放到一个集合里面,然后遍历插入,个人觉得用set比较合适因为set是不可重复的,这样才比较符合数据库。
⑽ 怎样用Hibernate配置多个数据源
如果用xml配置的话,那就写两个配置文件,可以不再用“hibernate.cfg.xml”做文件名,随便什么都可以,像“mysql.cfg.xml”或“sqlserver.xml”都行。用Configuration类获取SessionFactory的代码:
SessionFactory mysqlFactory = new Configuration().configure("mysql.cfg.xml").buildSessionFactory();
SessionFactory sqlserverFactory = new Configuration().configure("sqlserver.xml").buildSessionFactory();
如果你用spring,多数据库就更简单了,像这段代码可以完成所有配置:
<beans>
<bean id="mysqlDS" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url">
<value>jdbc:mysql://localhost:3306/test</value>
</property>
<property name="driverClassName">
<value>org.gjt.mm.mysql.Driver</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>123456</value>
</property>
</bean>
<bean id="mysqlFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="mysqlDS"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>test.hbm.xml</value>
</list>
</property>
</bean>
<bean id="sqlserverDS" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url">
<value>jdbc:odbc:test</value>
</property>
<property name="driverClassName">
<value>sun.jdbc.odbc.JdbcOdbcDriver</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>123456</value>
</property>
</bean>
<bean id="sqlserverFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="sqlserverDS"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>test.hbm.xml</value>
</list>
</property>
</bean>
.......
</beans>
hibernate和spring还有很多可行的配置,可以参考他们的references,有很详细地说明的。