2013-02-26 2 views
2

У меня есть абстрактный класс Event, который содержит свойства, общие для всех типов событий и под ним. У меня есть два подкласса с одной таблицей в классе (MasterEvent и ParentEvent).Grails cast sqltype «number» to String

Проблема заключается в том, что в MasterEvent столбец id имеет тип «число», а в ParentEvent он имеет тип «varchar2». Это означает, что, когда я пытаюсь запустить приложение я получаю:

Вызванный HibernateException: Неправильный тип столбца в * для столбца event_id. Найдено: число, ожидаемое: varchar2 (255 символов).

Обратите внимание, что это устаревшая база данных, поэтому нет возможности изменить типы столбцов на уровне базы данных.

В примере кода ниже, должны помочь в понимании лучше:

Event.groovy


package a 

abstract class Event { 
    String id 

    static mapping = { 
     tablePerHierarchy "false" 
     id column: "id" 
    } 
} 

ParentEvent.groovy


package a 

class ParentEvent extends Event { 
    static mapping = { 
     id column: "id" 
    } 
} 

MasterEvent.groovy


package a 

class MasterEvent extends Event { 
    static mapping = { 
     id column: "id", type: "number" 
    } 
} 

Я попытался поставить type: number всевозможные комбинации, но он всегда дает мне ту же ошибку.

Есть ли какой-либо листинг sqlType прямо на String или у grails игнорировать эту проверку?

+0

Есть ли ответ на этот вопрос? – Gideon

ответ

0

Вы пытались определить поле id в подклассах? «String id» в родительском событии и «long id» в Master event?

+0

Да, если я это сделаю, он либо: а) жалуется на то, что другой является «String», или b) Говорит, что типы возвращаемых данных несовместимы (что я считаю нечетным, потому что я помню, что java.lang.Long может быть cast to java.lang.String) – user2111409

1

type: 'number' не работает, потому что это не hibernate basic type

Попробуйте изменить его type: 'long' (или что подходит для вашего унаследованного DB)

Смотрите также документы: Link


Редактировать после вашего комментария

Я не знаю, что вы делаете в вашем абстрактном классе, но, возможно, вы можете сделать что-то подобное, и использовать сорбент в своем абстрактном классе (не тестировался!):

class MasterEvent extends Event { 

    Long longId   
    static mapping = { 
     longId column: "id" 
    } 

    @Override 
    String getId() { 
     longId?.toString() 
    } 
} 
+0

Я пробовал с типом: «long» и «big_integer» без успеха (всегда с той же ошибкой) – user2111409

+0

@ user2111409 Я отредактировал свой ответ, возможно, что помогает ... – moeTi

0

Вы можете попробовать обычай Hibernate UserType который берет столбец номера id и преобразует его в строку. Затем это будет проходить в классе MasterEvent:

static mapping = { 
    id column: "id", type: NumberToStringType 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^