Как настроить ограничения/сопоставление БД для карты в классе домена Grails

Следующий класс домена Grails:

class MyClass {
  Map myMap
}

Теперь для myMap Grails автоматически создает новую таблицу для элементов карты. Однако, если я добавляю слишком длинные элементы (например, 1024 символа), я получаю ошибку БД.

Могу ли я каким-то образом указать Grails сделать соответствующий столбец в таблице myMap достаточно большим, чтобы можно было использовать более крупные строки, или мне нужно сделать это вручную в БД?

я уже пробовал

static constraints = {
  myMap(maxSize:1024)
}

который не работает (как и ожидалось, потому что maxSize должен ссылаться на значения карты, а не на саму карту).

Если не через ограничения, возможно, есть способ сделать это через

static mapping { ... }

?


person Jörg Brenninkmeyer    schedule 13.07.2010    source источник


Ответы (2)


Альтернативный подход, который я успешно использовал, заключался в том, чтобы вытолкнуть карту в коллекцию класса домена-сотрудника.

class DynaProperty {
    String name
    String value

    static belongsTo = MyClass
    static constraints = {
        value(maxSize:4000)  //Or whatever number is appropriate
    }
}

А затем в MyClass:

class MyClass {
    static hasMany = [dynaProperties:DynaProperty]
}

Это почти карта, и она дает вам возможность использовать динамические средства поиска для поиска отдельной записи.

person Matt Lachman    schedule 13.07.2010
comment
Спасибо, вот так, наконец, я сделал это. Я попытался перезаписать установщик, чтобы вы могли напрямую передавать карту в качестве параметра, но это не сработало - например. public void setdynaProperties (карта карты) { map.each { this.addToDynaProperties (имя: it.key.toString (), значение: it.value.toString ()) } }. По крайней мере, это не сработало с помощью конструктора. - person Jörg Brenninkmeyer; 14.07.2010
comment
Круто, я рад, что общее решение сработало для вас. Мне любопытно, какая ошибка была с вашим сеттером? Я знаю, что у меня были проблемы с попыткой подделать свойство с типизированной сигнатурой метода, и что, если я использовал def (вместо public void), это, как правило, работало. Но это может относиться больше к геттерам, чем к сеттерам. - person Matt Lachman; 14.07.2010

Что вы пытаетесь достичь? На карте всегда одинаковое количество вещей? Если есть, вы должны определить эти свойства в своем классе.

Вы можете видеть проблему с вашим текущим подходом — нет никакого способа выяснить, что может быть на карте до времени выполнения, так как же Grails может создать для этого столбцы? Я удивлен, что это даже сработало с самого начала ...

person hvgotcodes    schedule 13.07.2010
comment
На самом деле карты поддерживаются просто отлично. Ключи должны быть строками. Однако я думаю, что вам нужно будет изменить базовый файл конфигурации гибернации, чтобы настроить таблицу, созданную для карты. См. grails.org/doc/latest/guide/ (раздел 5.2.4 Наборы, списки и карты — мне не удается правильно указать ссылку). - person Matt Lachman; 13.07.2010