2016-08-26 11 views
1

私が取り組んでいるプロジェクト(Grails 2.5.4/Hibernate 4.3)には、いくつかの異なるデータソースを使って、さまざまなクラスがあります。 2つの指定されたClassオブジェクトが同じdataSourceを使用するかどうかを判断する必要があります。Grailsでは、特定のクラスで使用されているデータソースへの参照を取得するにはどうすればよいですか?

Boolean doDataSourcesMatch(Class a, Class b) 
{ 
    return a.mapping.datasource == b.mapping.datasource 
} 

しかしa.mappingが閉鎖されるため、動作しませんもちろんの:私は何をしたいのようなものです。誰かがクラスによって使用されるdataSourceにアクセスする方法を知っていますか? 2つのクラスのクエリが同じ接続を使用するかどうかだけで、接続のプロパティを知る必要はありません。

多くの感謝!

答えて

1

これらのどれもが出て、具体的な何かを綴るませんが、彼らは助けることがあります。

  1. http://grails.1312388.n4.nabble.com/How-can-I-get-the-column-name-that-a-property-maps-to-for-a-domain-class-td4633766.html

  2. How to get the name of the table GORM object is mapped to?

私は特定の何かを発見していないが、これはすべてでありますむしろ奇妙です。私はあなたが既に知っていることを意味し、これはいくつかの動的クエリであると推測します。そうでなければ、一緒に問い合わせるべきものを知っているでしょう。

何とか回避策として、これはすでにどちらの場合で書かすなわち何を書いていないの場所や思考に入れている何かである場合、あなたが質問

// 
static String getDataSrc() { 
    return 'data_source_a' 
} 

//or 
static boolean canQuery() { 
    return true/false 
} 

内のすべてのドメインクラスに独自のゲッターを追加することができれば、そしてあなただけのどこからでもチェックすることができますこのような何か:

boolean canQuery = UserAttributes.canQuery() 
String currentDataSource = UserAttributes.dataSrc 

静的メソッドなので、インスタンス化は必要ありません。

User user = User.get(1) 
if (user.canQuery()) { 
// this is ok 
} 

あなただけ大文字のクラス名とそのメソッドを参照することで、どこからでも直接メソッドを呼び出すことができます。これは、あなたが

ユーザオブジェクト(1)あなたがする必要はありませんがある場合を意味します。

String currentDataSource = UserAttributes.dataSrc 
//Where this is exactly the same as above 
String currentDataSource = UserAttributes.getDataSrc() 

E2A:答えは:あなたがリストを比較する必要があるので、

import org.grails.orm.hibernate.cfg.GrailsDomainBinder 

class TestController { 
//either this method 
def binder = new org.grails.orm.hibernate.cfg.GrailsDomainBinder().getMapping(Photos.class) 
     println "binder : ${binder.table.name}" 
     println "b: ${binder.datasources}" 

//Or this 
     def dc=GrailsDomainBinder.getMapping(Photos.class) 

     println "-dc is ${dc}" 
     println "${dc.datasources}" 
} 

dc.datasources

リストです。もちろん

愚かな私を、あなたは、動的テーブル名を与えているHQLでのようなものを照会している場合は$ {にtableA} $ {TABLEB}

あなたは GrailsDomainBinderを呼び出すことができるように、実際のドメインクラスにアクセスする必要があります

So something likedef domainClass = grailsApplication.getDomainClass(domain).clazz

が与えられたtableNameのために、あなたの実際のdomainClassを与えるだろう。しかし、あなたのドメインは完全修飾パッケージ名でなければなりません。 )あなたは、サービス/コントローラの外にいる場合ので、あなたは代わりに使用することができcom.domain.users.tableAcom.domain.info.tableB

を照会する場合:

def domainClass=Holders.grailsApplication?.domainClasses?.find { it.clazz.simpleName == tableName }?.clazz 

または保有せず、あなたがコントローラサービスにgrailsApplicationを宣言している場合:

def domainClass=grailsApplication?.domainClasses?.find { it.clazz.simpleName == tableName }?.clazz 
+1

も実際に各クラスのデータソース名を静的な文字列として宣言してから、ドメインオブジェクトのデータソースをその静的宣言に設定することができます。上記のように静的な文字列を再利用すると、mapping = {dataSource = dataSrc}となり、クラスごとに一度だけ宣言されます。 – Vahid

+0

@vahidにお返事ありがとうございます。可能であれば、各クラスにコードを追加してデータソースの名前を返すことを避けたいと思います。私はたくさんのクラスを持っています。それは首のメンテナンスに苦労します。しかし、あなたが提供したリンクから何かを見つけ出すことができるかどうかがわかります。これまで有望なGrailsDomainBinder.getMapping(MyClass)が見つかりましたが、メソッドのシグネチャはありません:静的GrailsDomainBinder.getMapping()は引数タイプに適用できます:(java.lang.Class)values:[MyClass ]可能な解決策:getMapping(java.lang.Class)、getMapping(GrailsDomainClass) " –

+0

GrailsDomainBinderで私の回答が更新されました@DavidLeaman – Vahid

関連する問題