1

プロセスの背後にあるビジネス ロジックに焦点を当てるために、Grails でドメインを作成しました。いくつかのケースでは、これは GORM が生成する後方参照に変換され、Oracle の制限を超え、「ORA-00972: 識別子が長すぎます」というエラーが生成されます。ブロックを使用しstatic mappingて長いテーブル名を再マップできましたが、生成された後方参照に対して同じことを行う方法がわかりません。

次の例は、会社の機密情報を公開することなく、問題を示しています。

class UnfortunatelyLongClassName {
    static mapping = {
        table "long_class" // This works great!
    }

    List<Part> parts

    static hasMany = [parts:Part]
}

class Part {
    String name

    // This generates UNFORTUNATELY_LONG_CLASS_NAME_ID and causes the error
    static belongsTo = [UnfortunatelyLongClassName]
}

生成されたテーブルの大まかなDDL...

LONG_CLASS (
  ID number(19, 0) not null,
  VERSION number(19, 0) not null,
  primary key (id),
);

PART (
  ID number(19, 0) not null,
  VERSION number(19, 0) not null,
  NAME varchar2(255),
  PARTS_IDX number(10, 0),
  UNFORTUNATELY_LONG_CLASS_NAME_ID number(19, 0) not null,
  primary key (id),
  foreign key FK589895C372DB95A (UNFORTUNATELY_LONG_CLASS_NAME_ID) references UNFORTUNATELY_LONG_CLASS_NAME(ID)
);

これを取得して短い識別子を作成するための静的マッピングコマンドまたはその他の Grails/GORM トリックはありますか?

以下を使用すると...

static belongsTo = [unfortunatelyLongClassName:UnfortunatelyLongClassName]

static mapping = {
    unfortunatelyLongClassName column:"ulcn_id"
}

次のエラーが表示されます...

| Error 2012-07-24 17:53:49,060 [pool-7-thread-1] ERROR context.ContextLoader  - Context initialization failed
Message: Error creating bean with name 'pluginManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is org.codehaus.groovy.grails.exceptions.InvalidPropertyException: No property found for name [unfortunatelyLongClassName] for class [class mycompany.myproject.mypackage.Part]
   Line | Method
->> 303 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   138 | run      in java.util.concurrent.FutureTask
|   886 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   908 | run      in     ''
^   662 | run . .  in java.lang.Thread

Caused by InvalidPropertyException: No property found for name [unfortunatelyLongClassName] for class [class mycompany.myproject.mypackage.Part]
->> 303 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   138 | run      in java.util.concurrent.FutureTask
|   886 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   908 | run      in     ''
^   662 | run . .  in java.lang.Thread
| Error 2012-07-24 17:53:49,094 [pool-7-thread-1] ERROR context.GrailsContextLoader  - Error executing bootstraps: Error creating bean with name 'pluginManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is org.codehaus.groovy.grails.exceptions.InvalidPropertyException: No property found for name [unfortunatelyLongClassName] for class [class mycompany.myproject.mypackage.Part]
Message: Error creating bean with name 'pluginManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is org.codehaus.groovy.grails.exceptions.InvalidPropertyException: No property found for name [unfortunatelyLongClassName] for class [class mycompany.myproject.mypackage.Part]
   Line | Method
->> 303 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   138 | run      in java.util.concurrent.FutureTask
|   886 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   908 | run      in     ''
^   662 | run . .  in java.lang.Thread

Caused by InvalidPropertyException: No property found for name [unfortunatelyLongClassName] for class [class mycompany.myproject.mypackage.Part]
->> 303 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   138 | run      in java.util.concurrent.FutureTask
|   886 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   908 | run      in     ''
^   662 | run . .  in java.lang.Thread
4

2 に答える 2

3

Map 構文を使用しbelongsToてバックリンクを生成し、マッピングを介して名前を変更します。

static belongsTo = [unfortunatelyLongClassName:UnfortunatelyLongClassName]

static mapping = {
    unfortunatelyLongClassName column:"ulcn_id"
}

belongsToDomain クラスのフィールドでも動作するはずなので、次のようにすることができます。

UnfortunatelyLongClassName unfortunatelyLongClassName

static belongsTo = UnfortunatelyLongClassName

static mapping = {
    unfortunatelyLongClassName column:"ulcn_id"
}

以前のバージョンでは不足しているプロパティの例外がスローされるため、短い名前でプロパティを作成し、マッピング ブロックをスキップしてみてください。

UnfortunatelyLongClassName ulcn

static belongsTo = UnfortunatelyLongClassName
于 2012-07-24T20:35:13.683 に答える
0

長いクラスの ID を変更しようとするとどうなりますか? お気に入り:

static mapping = {
    id name: 'simple_id_name'
}
于 2012-07-24T20:42:33.357 に答える