2011-09-12 3 views
1

を持つ:http://burtbeckwith.com/blog/?p=70のGrails:データソースプラグインで、私はここで説明Grailsのためplugingデータソースを使用しているさまざまなデータソース間でトラブルのドメインクラスを結ぶ

私は、同じサーバー上に2つのMySQLデータベース・スキーマに接続しています:my_schema_1をとmy_schema_2。私が必要とするデータのほとんどはmy_schema_1から来ますが、テーブルの1つにmy_schema_2のテーブルの1つを参照するカラムが含まれています。ここで

は私のデータソースの定義は、私のDatasources.groovyファイル(簡体字)にあります。私は上の基準クエリを実行しようとするたびに

class Question { 
    String text 
    Answer answer 
    Genre genre 
} 

class Answer { 
    String text 
} 

class Genre { 
    String name 
} 

:ここ

datasources = { 
    datasource(name: 'my_schema_1') { 
     domainClasses([Question, Answer]) 
     driverClassName('com.mysql.jdbc.Driver') 
     url('jdbc:mysql://test.myserver.com/my_schema_1') 
     username('***') 
     password('***') 
    } 

    datasource(name: 'my_schema_2') { 
     domainClasses([Genre]) 
     driverClassName('com.mysql.jdbc.Driver') 
     url('jdbc:mysql://test.myserver.com/my_schema_2') 
     username('***') 
     password('***') 
    } 
} 

は私の3クラス定義されています質問クラスでは、次のマッピング例外が発生します。

An association from the table question refers to an unmapped class: Genre 

質問クラスのgenreプロパティは、すべて正常に動作します。 Genreクラス自体で条件クエリを実行すると、 すべて正常に動作します。スキーマ間で2つのクラスを結合することに問題があるようです。 (もちろん、 何かが間違っているか間違っていた可能性も非常に高いです。)

私は何か間違っているのですか、これはデータソースプラグインの制限ですか?そして、これがプラグインの制限事項であれば、私が必要とするものを達成するためにどのような選択肢を使用できますか?

ご協力いただきありがとうございます。

おかげで、

B.J.

答えて

1

データベースが同じサーバー上にあるため、より簡単な解決策が見つかりました。

次のように私は単純に(データベースを指定せずに)1つのデータソースを定義します。

datasources = { 
    datasource(name: 'my_schemas') { 
     domainClasses([Question, Answer, Genre]) 
     driverClassName('com.mysql.jdbc.Driver') 
     url('jdbc:mysql://test.myserver.com') 
     username('***') 
     password('***') 
    } 
} 

その後、私は自分のドメインクラスマッピングセクションでデータベースを指定します。

class Question { 
    String text 
    Answer answer 
    Genre genre 

    static mapping = { 
     table 'my_schema_1.question' 
    } 
} 

class Answer { 
    String text 

    static mapping = { 
     table 'my_schema_1.answer' 
    } 
} 

class Genre { 
    String name 

    static mapping = { 
     table 'my_schema_2.genre' 
    } 
} 

繰り返しますが、これだけ作品を2つのデータベースが同じサーバー上にあり、同じユーザー名/パスワードを使用しているためです。

3

データソースプラグインが唯一のデータベース間の弱い参照をサポートしています。これは、あなた自身が団体の完全性を管理する必要があることを意味します。これを実現する最善の方法は、両方のドメインインスタンスを照会し、複合ドメインインスタンスを提供できるサービスを実装することです。

あなたが参照したリンクは、これをエントリの最後に向かって指摘しています。また、grailsメーリングリストにはsame questionが投稿されています(回答しています)。

+0

ありがとうございます、Joshua、ご返信ありがとうございます。私は次回に投稿する前に私の読書のスキルに取り組んでいます。あなたが望むことを達成する唯一の方法は、両方のテーブルを個別にクエリして自分で結合することですか? – Benny

+0

それは正しいです。実際に、親インスタンスのDomainクラス内に子インスタンスを照会するロジックを配置することができます。しかし、代わりにサービスを使用する方が簡単なルートのようです。 –

関連する問題