2016-12-23 10 views
1

私はそれのGrailsの

一部が抽出に構成されています(角度使って、足場が、クライアント側)の角ベースのCRUDアプリケーションのための発電機を書き込もうとしていますGORMのメタ情報 今、私は明らかに硬い壁に当たっています。

IDフィールドが生成されず、アプリケーションによって管理されるケースを処理したいと考えています。私は「phoneidなど」である必要があり、ここで、このクラスのための識別子としてのフィールドを取得したいと思います

@Resource(readOnly = false, formats = ['json', 'xml']) 
class Phone { 

    int age 
    String phoneId 
    String imageUrl 
    String name 
    String snippet 

    static mapping = { 
     id name: 'phoneId', generator: 'assigned' 
} 

    static constraints = { 
     snippet(nullable: true, maxSize: 2000) 
    } 
} 

: は、私のようなクラス定義を持っていると言います。

しかし、私が求める場合:私は代わりに何を得る

grailsApplication.getDomainClass(com.phonecat.Phone.getName()).identifier 

プロパティで、ロングタイプの 'ID' と呼ばれる:

[email protected] name = 'id', type = Long, persistent = true, optional = false, association = false, bidirectional = false, association-type = [null]] 

アムIの誤使用getIdentifier方法を? 私が見逃したことはありますか? またはGrails/GORMでバグを起こしましたか?完全のために

が、ここで私が使用しているGORMのバージョンである(私の知る限り...たくさんのことを... GORM側で最近変更):build.groovyから

compile "org.grails.plugins:hibernate5" 
compile "org.hibernate:hibernate-core:5.1.2.Final" 
compile "org.hibernate:hibernate-ehcache:5.1.2.Final" 

また、私はこれらのテストを実行するために、Grailsのコンソールプラグインを使用しています:

runtime 'org.grails.plugins:grails-console:2.0.6' 
(私は本当に素晴らしい見つける。)

をしかし、おそらく同じことは、通常の内から実行することができコマンドラインコンソール。ここで

は、私が使用するコードです:

import com.phonecat.* 

println grailsApplication.getDomainClass(Phone.getName()).identifier 

def d = grailsApplication.getDomainClass(Phone.getName()) 
println "${d.class} ${d.clazz.name} ${d.identifier}" 

def pd = Phone.findAll().each {c -> 
    println "${c.id} ${c.phoneId}" 
} 
null 

質問は次のとおりです。(実際にあることを起こると...)私は、ドメインに関するメタ情報を取得するためのプラグインを書いていると仮定しますクラス; GORMから、このクラスにフィールド 'phoneId'が一意の識別子として割り当てられているという情報を取得するにはどうしたらよいですか?これはRESTを通じてリソースにクエリを実行するときに調べるべき値ですか?

+0

'String phoneId'を' String id'に変更しようとしましたか?さらに、 'phoneId'を制約から削除することを忘れないでください。 –

+0

@Michael_Szulc:制約内のphoneId()は、足場を使用するときにフィールドがレンダリングされる順序を保証するためにのみ存在しました。彼らのように削除され、実際には、この質問には役に立たない。 私はあなたの提案を試してみました。この場合、識別子メソッドは正しく名前 'id'とタイプ文字列のIDを報告します。 でも私の問題は解決しません。モデルを変更しようとしています。私は実際に私のモデルのメタ情報を取得するプラグインを作成しています(したがって、識別子フィールドも同じです)。だから私は、ユニークな識別子として与えられたフィールドの名前を取得するメソッドを望む – precchia

答えて

0

一般的に、モデルのマッピングを検査する場合は、GrailsDomainClassの代わりにGORM APIを使用します。これを行うには、MappingContextへの参照を取得する必要があります(これはSpringによって依存性が注入される可能性があります)。次に、:

PersistentEntity entity = mappingContext.getPersistentEntity(Phone.name) 
println entity.identity.name 
+0

おっと!神自身が私の質問に答えたことに気付かなかった... これを指摘してくれたThanks Graeme。 MappingContextについて知らなかった そして、はい、間違いなく動作します。私は正しく 'phoneId'という名前のIDを返し、文字列を入力します。 これは、すべてのコードをリファクタリングする必要があることを意味します。しかし確かにそれはずっときれいになるでしょう。 – precchia