2016-11-28 2 views
0

У меня есть 2 базы данных - это mysql, а другая - postgree. Я попытался получить данные postgree из транзакционного метода mysql.Вызвать транзакционный метод Воспроизвести 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; 
    } 
} 

из другого метода

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

я получил ошибку

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

поэтому мой метод Postgre признан сделки MySql, которая является точка зрения не существует в базе данных MySQL. как получить данные из разных единиц хранения с 1 методом?

+1

Не знаю, что вы говорите. EntityManagerFactory - для одной базы данных. Итак, решите, что это такое ... MySQL или PostgreSQL –

ответ

0

Я никогда не делал этого (разные базы данных), но я думаю, что следующее может работать.

Например, у вас есть следующее определение источника данных в 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 

Вместо использования @Transactional аннотации, управлять транзакциями в явном виде и использовать JPA withTransaction API:

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

Примечание. Я предпочитаю всегда использовать withTransaction, так как он позволяет лучше контролировать несчастливый поток. Вы должны завернуть вызов с помощью try-catch. Если JPA выбрасывает исключение во время выполнения при фиксации, вы можете выполнить правильную обработку ошибок. В случае использования аннотации @Transactional фиксация происходит после завершения работы контроллера, и вы не можете справиться с этой ошибкой.