2017-09-19 2 views
0

Je travaillais avec l'application, où plusieurs connexions DB sont nécessaires. J'ai créé AbstractDao.class où je veux utiliser EntityManager défini pour une classe Entity spécifique. Dans mon exemple, j'ai défini deux types d'entités: OracleEmployeeEntity et MySQLEmployeeEntity. Comment définir EntityManager dans AbstractDao pour utiliser l'instance correcte pour les entités correctes? Au-dessous de ma configuration actuelle, lorsque j'exécutais un test avec l'utilisation de deux dbs NullPointerException est levée.JPA comment définir quelle unité de persistance utilise pour la classe d'entité spécifique

AbstractDao.class:

@Transactional 
public abstract class AbstractDao<T, K extends Serializable> implements IDao<T, K> { 

@PersistenceContext 
protected EntityManager entityManager; 

private Class<T> domainClass; 

@Override 
public T save(T entity) { 
    entityManager.persist(entity); 
    return entity; 
} 

@Override 
@SuppressWarnings("unchecked") 
public T getOne(K id) { 
    return entityManager.getReference(getDomainClass(), id); 
} 

[...] 

fichier persistence.xml:

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
     http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" 
     version="2.1"> 

<persistence-unit name="default" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
    <class>com.example.database.tests.entities.OracleEmployeeEntity</class> 
    <properties> 
     <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/> 
     <property name="javax.persistence.jdbc.user" value="test_user"/> 
     <property name="javax.persistence.jdbc.password" value="test_user"/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521/xe"/> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"/> 
     <property name="hibernate.flushMode" value="FLUSH_AUTO"/> 
     <property name="hibernate.show_sql" value="true"/> 
    </properties> 
</persistence-unit> 

<persistence-unit name="db1" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
    <class>com.example.database.tests.entities.OracleEmployeeEntity</class> 
    <properties> 
     <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/> 
     <property name="javax.persistence.jdbc.user" value="test_user"/> 
     <property name="javax.persistence.jdbc.password" value="test_user"/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521/xe"/> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"/> 
     <property name="hibernate.flushMode" value="FLUSH_AUTO"/> 
     <property name="hibernate.show_sql" value="true"/> 
    </properties> 
</persistence-unit> 

<persistence-unit name="db2" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
    <class>com.example.database.tests.entities.MySqlEmployeeEntity</class> 
    <properties> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
     <property name="javax.persistence.jdbc.user" value="root"/> 
     <property name="javax.persistence.jdbc.password" value="root"/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/employees"/> 
     <property name="hibernate.flushMode" value="FLUSH_AUTO"/> 
     <property name="hibernate.show_sql" value="true"/> 
    </properties> 
</persistence-unit> 

partie du test:

//db variable defined in @Before (jUnit) 
    @Test 
    public void testShouldCompareDataFromDifferentDatabases() { 
    //given 
    MySQLDatabase mySQLDatabase = new MySQLDatabase(); 

    //when 
    long oracleCount = db.getEmployeeDao().count(); 
    long mySqlCount = mySQLDatabase.getEmployeeDao().count(); 

    //then 
    assertNotEquals(oracleCount, mySqlCount); 
} 

stacktrace:

java.lang.NullPointerException 
at com.example.database.base.AbstractDao.count(AbstractDao.java:74) 
at com.example.database.tests.assertions.JpaTest.testShouldCompareDataFromDifferentDatabases(JpaTest.java:166) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
at com.example.core.tests.testRunners.core.CustomRunAfters.evaluate(CustomRunAfters.java:39) 
at com.example.core.tests.testRunners.ParallelTestClassRunner.run(ParallelTestClassRunner.java:36) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) 
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51) 
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:237) 
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
+0

exception détaillée s'il vous plaît. Quel serveur utilisez-vous? Quel genre d'application/environnement? –

+0

stacktrace mis à jour avec une partie du test – pwoj

Répondre

0

@PersistenceContext a un attribut unitName, puisque vous ne l'avez pas spécifié un nom par défaut unité il string.you vide devez spécifier le unitname que vous souhaitez utiliser

@PersistenceContext(unitName= "someunitname") 
protected EntityManager entityManager; 
+0

Malheureusement, toujours la même exception. J'ai lu que @PersistenceContext ne crée pas d'instance de EntityManager, c'est peut-être un problème? Quoi d'autre, AbstractDao est une classe générale, spécifique. Hardcoding de l'unité de persistance J'aimerais passer à une implémentation concrète. – pwoj

+0

@pwoj et où est votre trace de pile d'exception? C'est basique pour aider –