2009-12-17 10 views
18

Soy una nueva abeja para Hibernar y probar cosas. Una cosa que parece divertir a todos es cómo conectarse a diferentes bases de datos? Tengo dos preguntas aquí:Cómo conectarse a múltiples bases de datos en Hibernate

  1. si en la misma aplicación web que necesito para conectar a MySQL y Oracle, ¿cómo lo hago?
  2. Estoy usando MySQL y tengo dos bases de datos test1 y test2, ¿cómo puedo conectarme y recuperar datos?

He leído en un blog que podemos crear diferentes archivos de configuración y hacerlo. Lo probé pero no fue exitoso. Esto es lo que he intentado:

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

donde ruta es la ruta del archivo de configuración. ¿Es esta la manera correcta?

+1

¿Está utilizando la primavera? Si es así, esto se vuelve MUCHO más fácil – Zoidberg

+0

Sí, estoy usando resortes. Sería genial si me proporcionas un ejemplo de trabajo. – akellakarthik

Respuesta

32

Usar asignaciones de anotación como ejemplo:

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(); 

A continuación, utilice SF1 y SF2 para obtener las sesiones para cada base de datos. Para mapear archivos, simplemente use cfg.addClass en lugar de addAnnotatedClass. Coloque los archivos cfg.xml en el paquete raíz en este caso. Esos tendrán el dialecto de Oracle o MySQL y la información de conexión.

+0

Muchas gracias Brain. Eso era exactamente lo que estaba buscando. Karthik. – akellakarthik

+3

Sí, cerebro ...: P – gab06

2

Idealmente, debería pasar al tipo de transacción distribuida del sistema [utilizando Java Transaction Analyzer org.hibernate.transaction.JTATransactionFactory] en este caso. Si está ejecutando en JBoss App Server, puede hacerlo utilizando "Administradores de transacciones distribuidas". Puede obtener más información al respecto here.

0

Puede conectar dos bases de datos test1 y test2, recuperar datos con una sola hibernación con algunos trucos:

  • SQLQuery de hibernación: sólo tiene que añadir el nombre de base de datos con la tabla de "seleccionar * de test1.table1", " seleccionar * de test2.table2"

  • hibernación persistencia: utilizando el esquema XML clave en la asignación de hibernación

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

2

No se puede hacer utilizando un archivo de configuración de hibernación. Necesita tener dos archivos de configuraciones para ello.

Para configurar la base de datos mysql

hibernate-mysql.cfg.xml 

Para configurar la base de datos oracle

hibernate-oracle.cfg.xml 

En detalles, mysql archivo de configuración de ser así.

<?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> 

En Detalles, oracle archivo de configuración sería así.

<?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> 

Y el código debería ser así.

configuración MySQL

private static SessionFactory sessionAnnotationFactory; 

sessionAnnotationFactory = new Configuration().configure("hibernate-mysql.cfg.xml").buildSessionFactory(); 

Session session = sessionAnnotationFactory.openSession(); 

sql Oracle configuración

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

Session session = sessionAnnotationFactory.openSession() 
0

También puede agregar la clase de asignación de archivo configuration.xml

Nota: esto es para anotaciones y para los recursos utilizan la palabra clave resources en lugar de la clase

<mapping class="packageName.classNmae1"/> 
<mapping class="packageName.classNmae2"/> 
Cuestiones relacionadas