2016-11-28 10 views
0

私は2つのデータベースを1つはmysqlと他はpostgreeです。 mysqlのトランザクションメソッドからポスト度データを取得しようとしました。別の方法トランザクションメソッドを呼び出すJava JPA Hibernateを再生する

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

から

@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; 
    } 
} 

私はので、私のPostgre方法は、MySQLデータベースに存在しない図であるMySQLのトランザクションとして認識エラー

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

を得ました。どのように私は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アノテーションを使用する場合、コントローラが終了した後にコミットが行われ、エラーを処理できません。

関連する問題