如何连接到Hibernate中的多个数据库

我是新的蜜蜂Hibernate和尝试的东西。 似乎有趣的一件事是如何连接到不同的数据库? 我在这里有两个问题:

  1. 如果在同一个Web应用程序中,我需要连接到MySQL和Oracle,我该怎么做?
  2. 我正在使用MySQL,并有两个数据库test1和test2,如何连接和检索数据?

我已经在博客中读过我们可以创build不同的configuration文件。 我尝试过,但没有成功。 这是我的尝试:

SessionFactory sf = (SessionFactory) new Configuration().configure(path); 

其中path是configuration文件的path。 这是正确的吗?

以注记映射为例:

 Configuration cfg1 = new AnnotationConfiguration(); cfg1.configure("/hibernate-oracle.cfg.xml"); cfg1.addAnnotatedClass(SomeClass.class); // mapped classes cfg1.addAnnotatedClass(SomeOtherClass.class); SessionFactory sf1 = cfg1.buildSessionFactory(); Configuration cfg2 = new AnnotationConfiguration(); cfg2.configure("/hibernate-mysql.cfg.xml"); cfg2.addAnnotatedClass(SomeClass.class); // could be the same or different than above cfg2.addAnnotatedClass(SomeOtherClass.class); SessionFactory sf2 = cfg2.buildSessionFactory(); 

然后使用sf1和sf2获取每个数据库的会话。 对于映射文件,您只需使用cfg.addClass而不是addAnnotatedClass。 在这种情况下,将cfg.xml文件放在根包中。 那些将有Oracle或MySQL的方言和连接信息。

理想情况下,在这种情况下,您应该转移到分布式事务types的系统[使用Java事务分析器org.hibernate.transaction.JTATransactionFactory]。 如果您正在JBoss App Server中运行,可以使用“分布式事务pipe理器”来完成。 你可以在这里了解更多。

你可以连接两个数据库test1和test2,用一些技巧只用一个hibernate检索数据:

  • hibernateSQLQuery:只需添加数据库名称与表“select * from test1.table1”,“select * from test2.table2”

  • hibernate持久性:在hibernate映射xml中使用关键模式

    <class name="Table1Class" table="table1" schema="test1"> <class name="Table2Class" table="table2" schema="test2">

它不能使用一个hibernateconfiguration文件来完成。 你需要有两个configuration文件。

configurationmysql数据库

 hibernate-mysql.cfg.xml 

configurationoracle数据库

 hibernate-oracle.cfg.xml 

在Details中, mysqlconfiguration文件就是这样的。

 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.bytecode.use_reflection_optimizer">false</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.password">PASSWORD</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/UR_DB_NAME</property> <property name="hibernate.connection.username">USERNAME</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <mapping class="domain.EmployeeMysql"></mapping> </session-factory> </hibernate-configuration> 

在Details中, oracleconfiguration文件就是这样的。

 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.bytecode.use_reflection_optimizer">false</property> <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="hibernate.connection.password">PASSWORD</property> <property name="hibernate.connection.url">jdbc:oracle:thin:UR DB NAME</property> <property name="hibernate.connection.username">USERNAME</property> <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> <property name="show_sql">true</property> <mapping class="domain.EmployeeOracleSql"></mapping> </session-factory> </hibernate-configuration> 

而代码应该是这样的。

mysqlconfiguration

 private static SessionFactory sessionAnnotationFactory; sessionAnnotationFactory = new Configuration().configure("hibernate-mysql.cfg.xml").buildSessionFactory(); Session session = sessionAnnotationFactory.openSession(); 

oracle sqlconfiguration

 sessionAnnotationFactory = new Configuration().configure("hibernate-oracle.cfg.xml").buildSessionFactory(); Session session = sessionAnnotationFactory.openSession()