2016-11-28 2 views
0

J'ai 2 base de données l'un est mysql et l'autre est postgree. J'ai essayé d'obtenir des données postgree à partir de la méthode transactionnelle mysql.Méthode transactionnelle d'appel Lecture Java JPA Hibernate

@Transactional(value = "pg") 
    public List<String> getSubordinate(){ 
     Query q1 = JPA.em().createNativeQuery("select vrs.subordinate_number, vrs.superior_number\n" + 
       "from view_reporting_structure vrs\n" + 
       "where vrs.superior_number = :personel_number"); 
     q1.setParameter("personel_number","524261"); 
     List<String> me = q1.getResultList(); 
     return me; 
    } 
} 

d'une autre méthode

@Transactional 
public Result getOpenRequestList(){ 
    Subordinate subordinate = new Subordinate(); 
    List<String> subordinateData = subordinate.getSubordinate(); 
    .... 
} 

i got erreur

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'db_hcm.view_reporting_structure' doesn't exist 

donc ma méthode Postgre reconnue comme transaction mySQL qui est le point de vue ne pas exister dans la base de données mySQL. comment puis-je obtenir des données provenant d'une unité de présistence différente avec une méthode?

+1

Aucune idée de ce que vous dites. une EntityManagerFactory est pour une base de données unique. Alors décidez qui c'est ... MySQL ou PostgreSQL –

Répondre

0

Je ne l'ai jamais fait (différentes bases de données), mais je suppose que ce qui suit peut fonctionner.

Par exemple, vous avez la définition de source de données suivante dans application.conf:

# MySql 
db.mysql.driver=com.mysql.jdbc.Driver 
... the rest of setting for db.mysql 

# H2 
db.postgre.driver=org.postgresql.Driver 
... the rest of setting for db.postgre 

Au lieu d'utiliser l'annotation @Transactional, gérer explicitement une transaction et utiliser l'API JPA withTransaction:

private static final String MYSQL_DB = "mysql"; 
private static final String POSTGRE_DB = "postgre"; 

public List<String> getSubordinate() { 
    JPA.withTransaction(MYSQL_DB, true/* this is read-only flag*/, 
    () -> { 
     Query q1 = JPA.em().createNativeQuery("select vrs.subordinate_number, vrs.superior_number\n" + 
      "from view_reporting_structure vrs\n" + 
      "where vrs.superior_number = :personel_number"); 
     q1.setParameter("personel_number","524261"); 
     List<String> me = q1.getResultList(); 
     return me; 
    } 
} 

public Result getOpenRequestList(){ 
    JPA.withTransaction(POSTGRE_DB, true/* this is read-only flag*/, 
    () -> { 
     Subordinate subordinate = new Subordinate(); 
     List<String> subordinateData = subordinate.getSubordinate(); 
     .... 
    } 
} 

Note: Je préfère toujours utiliser avecTransaction, car il permet un meilleur contrôle des flux malheureux. Vous devriez envelopper l'appel avec try-catch. Si JPA lève une exception d'exécution lors de la validation, vous pouvez gérer correctement les erreurs. En cas d'utilisation de l'annotation @Transactional, la validation a lieu après que le contrôleur a terminé et vous ne pouvez pas gérer l'erreur.