簡體   English   中英

對舊數據庫使用grails

[英]using grails with legacy database

我面臨將Grails與舊版Oracle數據庫一起使用的問題。 我有帶有主鍵文本列TARGETTYPECODE的舊表TARGETTYPES:

CREATE TABLE "TMS"."TARGETTYPES" 
   (    "TARGETTYPECODE" VARCHAR2(100) NOT NULL ENABLE, 
    "TARGETTYPEDESCR" VARCHAR2(255 CHAR), 
    "ACTIVE" CHAR(1) DEFAULT 'Y' NOT NULL ENABLE, 
     CONSTRAINT "TARGETTYPES_PK" PRIMARY KEY ("TARGETTYPECODE")
   )

我創建了grails域類:

package tmsconf

class Targettypes {

    static transients = ['Targettypecode']
    void setTargettypecode(String Targettypecode) {
            id = Targettypecode
    }

    String  getTargettypecode() {
            return Targettypecode
    }

    String targettypedescr
    String active

    static mapping = {
         table 'TARGETTYPES'
         version false
         columns {
             id generator:'assigned', column:"TARGETTYPECODE", type:'text'
         } 
    }

    static constraints = {
        id()
        targettypecode(size: 1..100, blank: false)
        targettypedescr(size: 0..255)
        active(size: 1..1, blank: false)
        id(nullable: true)
    }
    String toString() {
        return "${targettypecode}" 
    }
}

我也創建了控制器類:

package tmsconf

class TargettypesController {
    def scaffold = true
}

應用程序已成功啟動。

當我單擊鏈接tmsconf.TargettypesController時,控制台出現錯誤:

Error 2012-10-10 10:55:37,243 [http-bio-8080-exec-9] ERROR util.JDBCExceptionReporter  - ORA-00918: column ambiguously defined

| Error 2012-10-10 10:55:37,305 [http-bio-8080-exec-9] ERROR errors.GrailsExceptionResolver  - SQLSyntaxErrorException occurred when processing request: [GET] /TMSConf/targettypes/list
ORA-00918: column ambiguously defined
. Stacktrace follows:
Message: ORA-00918: column ambiguously defined

    Line | Method
->>  445 | processError         in oracle.jdbc.driver.T4CTTIoer
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    396 | processError         in     ''
|    879 | processError . . . . in oracle.jdbc.driver.T4C8Oall
|    450 | receive              in oracle.jdbc.driver.T4CTTIfun
|    192 | doRPC . . . . . . .  in     ''
|    531 | doOALL               in oracle.jdbc.driver.T4C8Oall
|    207 | doOall8 . . . . . .  in oracle.jdbc.driver.T4CPreparedStatement
|    884 | executeForDescribe   in     ''
|   1167 | executeMaybeDescribe in oracle.jdbc.driver.OracleStatement
|   1289 | doExecuteWithTimeout in     ''
|   3584 | executeInternal . .  in oracle.jdbc.driver.OraclePreparedStatement
|   3628 | executeQuery         in     ''
|   1493 | executeQuery . . . . in oracle.jdbc.driver.OraclePreparedStatementWrapper
|     96 | executeQuery         in org.apache.commons.dbcp.DelegatingPreparedStatement
|     55 | <init> . . . . . . . in grails.orm.PagedResultList
|     15 | list                 in tmsconf.TargettypesController
|    186 | doFilter . . . . . . in grails.plugin.cache.web.filter.PageFragmentCachingFilter
|     63 | doFilter             in grails.plugin.cache.web.filter.AbstractFilter
|   1110 | runWorker . . . . .  in java.util.concurrent.ThreadPoolExecutor
|    603 | run                  in java.util.concurrent.ThreadPoolExecutor$Worker
^    722 | run . . . . . . . .  in java.lang.Thread

請幫忙,我哪里錯了

這應該工作:

package tmsconf

class Targettypes {

   String targettypecode
   String targettypedescr
   String active

   static mapping = {
      version false
      id generator: 'assigned', name: 'targettypecode'
   }

   static constraints = {
      targettypecode(size: 1..100, blank: false)
      targettypedescr(size: 0..255, nullable: true)
      active(size: 1..1, blank: false)
   }

   String toString() {
      targettypecode
   }
}

現在,您可以在mapping塊中使用name屬性,因此不需要創建臨時的get / set對來包裝ID。

我還刪除了表名和列名設置,因為它們設置為無論如何都會使用的設置,並刪除了type:'text'因為Hibernate知道字段的類型,因此可以將其用作列的類型。

另外,我根據顯示的SQL為targettypedescr添加了nullable: true

通常,當您嘗試映射到舊數據庫時,請使用http://grails.org/doc/latest/ref/Command%20Line/schema-export.html腳本查看Hibernate認為表應該是什么樣的。 調整constraintsmapping塊,直到“足夠接近”為止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM