Grails: сохранить литерал класса в базе данных - PullRequest
0 голосов
/ 06 марта 2012

Я хочу сохранить в базе данных что-то, должно ли это быть String или Integer. Моя фантазия была бы примерно такой:

Class FantasyClass{
  String someInfo
  Class whichClass
}

И тогда я мог бы назвать это так:

def thisThing = new FantasyClass(someInfo:'lalala',whichClass:String)

Есть ли способ обойти эту функциональность?

Куда я мог пойти, как:

def getAThing = FantasyClass.get(1)
assert getAThing.whichClass == String
assert 'thisIsAString' instanceof getAThing.whichClass  //THIS IS WHAT I REALLLLLLY WANT!!!

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Вы можете использовать asType метод

def getAThing = FantasyClass.get(1)
assert getAThing.whichClass == String
assert 'thisIsAString'.getClass() == getAThing.someInfo.asType(getAThing.whichClass)

Вот более общий пример:

def value = 123
def otherThing = new FantasyClass(
   someInfo: value.toString(),
   whichClass: value.getClass()).save()

assert otherThing.someInfo.asType(getAThing.whichClass) instanceof Integer

И вы можете добавить вспомогательный метод к классу домена, который преобразует строку в указанный вами тип:

def getTypedValue() {
   someInfo?.asType(foo)
}

и тогда вы можете сделать это:

assert otherThing.typedValue == 123
1 голос
/ 06 марта 2012

Вы можете иметь поле Class в классе домена без дополнительного кода.GORM автоматически сохранит его как полное имя класса.

Для других классов, где нет автоматического преобразования, вам нужна возможность преобразования в тип базы данных и обратно.Чтобы Grails автоматически конвертировал ваш тип, вам нужен hibernate UserType .Просто создайте класс, который реализует этот интерфейс, и сопоставьте ему поле в классе вашего домена:

static mapping = {
    whichClass type: MyUserType
}
...