Использование Groovy Enum в качестве поля Id в Grails - PullRequest
0 голосов
/ 23 февраля 2012

У нас есть некоторые устаревшие отображения базы данных в GORM, и у некоторых есть первичный ключ, который является перечислением. Перечисление хранится с использованием строковых значений, а не порядковых чисел.

Например:

class AccountingGLMap {
    AccountingTypeCode id
    String typeCode

    static mapping = {
        id(column: 'accountingTypeCode',  generator: 'assigned')
    }
}

Когда вы пытаетесь получить экземпляр, вы получаете:

| Error 2012-02-23 10:32:41,319 [pool-5-thread-1] ERROR context.GrailsContextLoader  - Error executing bootstraps: could not deserialize; nested exception is org.hibernate.type.SerializationException: could not deserialize

Я проверил, что значения в таблице правильно соответствуют указанному перечислению (я могу создать экземпляр объекта с помощью Enum, если это не первичный ключ). Если мы изменим Enum на String, все будет работать нормально.

Я видел статью, в которой утверждается, что вы не можете использовать Enum в качестве первичного ключа при использовании JPA, но даже это оспаривается.

У кого-нибудь есть опыт в этом деле?

РЕДАКТИРОВАТЬ: Для справки мы используем 2.0.1 против базы данных Oracle.

1 Ответ

0 голосов
/ 28 февраля 2012

Добавьте type: 'string' к вашему отображению идентификатора, а затем добавьте установщик для идентификатора, который принимает строковые данные, например:

class AccountingGLMap {
    AccountingTypeCode id
    GLTypeCode glTypeCode

    static mapping = {
        id(column: 'accountingTypeCode', type: 'string', generator: 'assigned')
    }

    void setId(String value) {
        id = value
    }
}
...