2010-11-05 9 views
9

Tengo una aplicación web Java EE6 bastante estándar que usa JPA 2 con inyección de dependencia conectada a una base de datos MySQL y todo funciona bien. Lo que me gustaría hacer ahora es hacer que esta aplicación interactúe con las bases de datos de otras aplicaciones que hemos instalado en un sitio de clientes, actuando esencialmente como un único punto de control para nuestras otras instalaciones de aplicaciones.Conexión JPA dinámica

Lo que estoy luchando es la mejor manera de realizar la interacción con las otras bases de datos. Idealmente, me gustaría crear un EntityManager para cada instalación e interactuar con JPA, pero no veo ninguna forma de configurarlo. Puedo, por ejemplo, tener 5 instalaciones (y por lo tanto bases de datos) de un tipo de aplicación y la aplicación de control maestro no sabrá sobre las otras instalaciones hasta el tiempo de ejecución. Esto parece impedir el uso de la inyección de dependencia de un EntityManager y toda la demacation de transacción automática, etc. La opción alternativa es simplemente crear un DataSource y realizar las interacciones manualmente. Si bien es flexible, esto requiere mucho más esfuerzo.

Entonces, mi pregunta es, ¿cuál es la mejor manera de abordar este problema?

Respuesta

5

También estoy en esto, y hasta ahora no he encontrado la siguiente entrada de blog que describe una manera de hacerlo http://ayushsuman.blogspot.com/2010/06/configure-jpa-during-run-time-dynamic.html:

eliminado todas las propiedades de su base de datos de persistance.xml

<persistence> 
<persistence-unit name="jpablogPUnit" transaction-type="RESOURCE_LOCAL"> 
<class>com.suman.Company</class> 
</persistence-unit> 
</persistence> 

cambiado de archivo java en el que está configurando entityManager, en nuestro caso TestApplication.java

package com.suman; 

import java.util.HashMap; 
import java.util.Map; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import org.apache.log4j.Logger; 

/** 
* @author Binod Suman 
*/ 
public class TestApplication { 

Logger log = Logger.getLogger(TestApplication.class); 
public static void main(String[] args) { 
TestApplication test = new TestApplication(); 
test.saveCompany(); 
} 

public void saveCompany(){ 
log.info("Company data is going to save"); 
EntityManagerFactory emf; 
Map properties = new HashMap(); 
properties.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver"); 
properties.put("hibernate.connection.url", "jdbc:mysql://localhost:3306/sumandb"); 
properties.put("hibernate.connection.username", "root"); 
properties.put("hibernate.connection.password", "mysql"); 
properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); 
properties.put("hibernate.show-sql", "true"); 
//emf = Persistence.createEntityManagerFactory("jpablogPUnit"); 
emf = Persistence.createEntityManagerFactory("jpablogPUnit",properties); 
EntityManager entityManager = (EntityManager) emf.createEntityManager(); 
entityManager.getTransaction().begin(); 
Company company = new Company(120,"TecnoTree","Espoo, Finland"); 
entityManager.persist(company); 
entityManager.getTransaction().commit(); 
log.info("Company data has been saved"); 
} 

} 
+0

persistance.xml en proje raíz ¿Connecticut? –

+0

@ e-info128 no en el lugar normal: src/main/resources/META-INF/persistence.xml (https://stackoverflow.com/questions/10871109/where-to-put-persistence-xml-in-library -jar-using-maven) – AmanicA

Cuestiones relacionadas