在Grails 2.0.0中使用鉴别器时映射异常

时间:2012-01-10 13:03:27

标签: grails gorm

一般来说,我遇到映射问题:org.hibernate.MappingException: Repeated column in mapping for entity: os.comida.StoreDocumentRw column: Type (should be mapped with insert="false" update="false")

引入问题:我有许多文档类型,其中每种文档类型与其他文档类型略有不同。所有这些都有共同的属性:日期,数字,发行者等。所以我决定将所有文档类型存储在一个物理表中(一个 - 这对我来说非常重要)。为了实现这个,我想使用hibernate鉴别器。

下面我粘贴了我的源代码。我有一个基类StoreDocument和两个文档类型StoreDocumentRwStoreDocumentWz

class StoreDocument {

    String type
    Date documentDate

    static mapping = {
        table '"StoreDocument"'
        version false
        id column:'"StoreDocumentID"', generator:'sequence', params:[sequence:'STORE_DOCUMENT_SEQ']
        discriminator column: '"Type"'
        documentDate column:'"DocumentDate"'
        type column:'"Type"'
    }    

}

class StoreDocumentRw extends StoreDocument {

    String rwSpecificData

    static mapping = {
        discriminator value: 'rw'
        rwSpecificData column:'"RwSpecificData"'        
    }
}

class StoreDocumentWz extends StoreDocument {

    String wzSpecificData

    static mapping = {
        discriminator value: 'wz'
        wzSpecificData column:'"WzSpecificData"'
    }
}

当我尝试运行应用程序时,我之前会提到org.hibernate.MappingException: Repeated column in mapping for entity: os.comida.StoreDocumentRw column: Type (should be mapped with insert="false" update="false")

当我将type insertable: false, updateable: false添加到StoreDocumentRw映射时,它仍然是相同的。

当我将type insertable: false, updateable: false添加到StoreDocument映射时,情况更糟:

ERROR hbm2ddl.SchemaExport  - Unsuccessful: create table COMIDA2."StoreDocument" ("StoreDocumentID" number(19,0) not null, "DocumentDate" timestamp not null, "Type" varchar2(255 char), "Type" varchar2(-1 char) not null, "WzSpecificData" varchar2(255 char), "RwSpecificData" varchar2(255 char), primary key ("StoreDocumentID"))
ERROR hbm2ddl.SchemaExport  - ORA-00957: duplicate column name

所以我不知道应该把这个可插入/可更新的东西放在哪里使它工作。我正在使用Grails 2.0.0和Oracle 10g。谁能告诉我我的代码有什么问题?


解决方案:

StoreDocument中的我的映射是错误的。剪切String typetype column:'"Type"'并编辑像discriminator column:[name:'"Type"',length:50]这样的鉴别器映射就足够了,结果如下:

class StoreDocument {

    Date documentDate

    static mapping = {
        table '"StoreDocument"'
        version false
        id column:'"StoreDocumentID"', generator:'sequence', params:[sequence:'STORE_DOCUMENT_SEQ']
        discriminator column:[name:'"Type"',length:50]
        documentDate column:'"DocumentDate"'
    }        
}

1 个答案:

答案 0 :(得分:2)

StoreDocument中,您有String typediscriminator column: '"Type"',因此从您的例外看起来Grails正在尝试创建两列名称类型。尝试更改String或标识符列的名称,看看是否可以解决问题。

要解决生成varchar(-1)字段的问题,请尝试以下来自此JIRA GRAILS-5168discriminator column:[name:'Type',length:10]。当然,将长度更改为您需要的任何长度。