Установите значение defaultValue для атрибута домена Grails равным Joda-Time Period.ZERO

Я использовал плагин Joda-Time для Grails. Мне это действительно нравится, но я пытаюсь установить значение по умолчанию для атрибута домена (Тип периода: PersistentPeriod). Все отлично работает. Я могу сохранять и извлекать данные Joda-Time, библиотека тегов работает хорошо, вычисления и преобразования безупречны, но все взрывается, когда я пытаюсь скомпилировать после установки значения по умолчанию для атрибутов Joda-Time. Пример:

class Person { 
    DateTime date 
    Period totalTime 
    static mapping = {
        totalTime (type: PersistentPeriod, defaultValue:Period.ZERO)
        date (type: PersistentDateTime, defaultValue:DateTime.now())
    } 
}

Есть ли способ сделать это со значениями по умолчанию или я должен оставить атрибуты Joda-Time пустыми и пустыми.


person CheddarMonkey    schedule 03.04.2014    source источник
comment
Что на самом деле взрывается? Предоставьте трассировку стека или описание ошибки.   -  person rxn1d    schedule 03.04.2014
comment
SchemaExport неуспешен: столбец SchemaExport PT0S не найден; Оператор SQL: Таблица SchemaExport ACCT_SHIFT не найдена; Оператор SQL:   -  person CheddarMonkey    schedule 04.04.2014


Ответы (1)


Указание defaultValue не будет работать так, как вы пытаетесь его использовать. Он предназначен для использования в качестве значения по умолчанию, которое MySQL может использовать при указании синтаксиса создания таблицы. Если вы просто хотите, чтобы какой-либо класс, для которого не задано значение по умолчанию, перепишите свой класс Person следующим образом:

class Person { 
  DateTime date = DateTime.now() 
  Period totalTime = Period.ZERO
  static mapping = {
    totalTime (type: PersistentPeriod)
    date (type: PersistentDateTime)
  } 
}

В качестве альтернативы вы можете использовать defaultValue: «CURRENT_TIMESTAMP» для DateTime .now () MySQL будет ожидать, что поле типа «TIMESTAMP», а не «DATETIME» будет работать.

person th3morg    schedule 03.04.2014
comment
Это работает. Думаю, я неправильно понял использование defaultValue. Спасибо, что прояснили это. - person CheddarMonkey; 04.04.2014
comment
Изучив немного больше о defaultValue и рассмотрев комментарии @ th3morg, я понял, что defaultValue в закрытии отображения конкретно влияет на создание и обновление базы данных. Следовательно, значение, присвоенное defaultValue, должно соответствовать «собственному» типу данных используемой мной базы данных. Итак, это работает: totalTime (type: PersistentPeriod, defaultValue: PT0S) - PT0S - это фактическая строка, которую Joda-Time сохраняет в столбце базы данных, varchar (255). - person CheddarMonkey; 04.04.2014
comment
Объявление значения по умолчанию в свойстве Period totalTime = Period.ZERO используется GORM, когда приложение сохраняет / обновляет объект домена и для атрибута totalTime нет значения / нулевого значения. См. этот пост Nabble о defaultValue. Думаю, я правильно понимаю. Пожалуйста, поправьте меня, если я ошибаюсь. - person CheddarMonkey; 04.04.2014
comment
... и еще одна поправка в эту тему. PT0S не работает. Не так конкретно напечатано. "PT0S" работает. - person CheddarMonkey; 04.04.2014
comment
... и другой. дату в закрытии сопоставления можно установить следующим образом: тип даты: PersistentDateTime, defaultValue: now (). Это также работает для стандартного типа данных Grails Date. См. этот другой вопрос StackOverflow - person CheddarMonkey; 04.04.2014