プロセスの背後にあるビジネス ロジックに焦点を当てるために、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