dateCreated, lastUpdated поля в Grails 2.0
У меня есть приложение, которое использует Grails 1.3.7, которое я только что перешел на Grails 2.0. Приложение использует автоматический dateCreated
а также lastUpdated
поля для управления временными метками, связанными с созданием и модификацией объектов. После обновления я получаю следующую ошибку:
| Running Grails application
| Error 2012-01-29 22:36:53,504 [Thread-8] ERROR util.JDBCExceptionReporter - ERROR: null value in column "date_created" violates not-null constraint
| Error 2012-01-29 22:36:53,510 [Thread-8] ERROR events.PatchedDefaultFlushEventListener - Could not synchronize database state with session
Комментирование вышеупомянутых полей в моих классах доменов устраняет проблему.
Есть dateCreated
а также lastUpdated
поля были объявлены устаревшими в Grails 2.0? Если это так, значит ли это, что мне нужно написать код для обработки этой функциональности вручную или код был перенесен в какой-то плагин, такой как плагин Audit-Trail?
3 ответа
Хорошо, исправили это, вручную установив для переменной autoTimestamp значение "true" в определениях класса домена:
static mapping = {
autoTimestamp true
}
Я предполагаю, что это свойство не устанавливается после переноса проекта с Grails 1.3.7 на 2.0.0.
Grails 2.0 по-прежнему поддерживает автоматические отметки времени. Это указано в руководстве (прокрутите немного вверх по этой ссылке).
Тем не менее, он конкретно упоминает:
Если вы положите
nullable: false
ограничения либоdateCreated
или жеlastUpdated
, ваши экземпляры домена не пройдут проверку - вероятно, не то, что вы хотите. Оставьте ограничения на этих свойствах, если вы не отключили автоматическую отметку времени.
В Grails 2.0.3 есть ошибка, которая может вызвать эту проблему при использовании Postgres. См. http://jira.grails.org/browse/GRAILS-8988. Проблема говорит, что она будет решена, когда выйдет 2.0.4.
Я нашел альтернативное решение, если вы работаете в Grails 4:
class ScheduledTaskServiceSpec extends Specification implements ServiceUnitTest<ScheduledTaskService>{
@Shared @AutoCleanup HibernateDatastore hibernateDatastore
@Shared AutoTimestampEventListener timestamper
void setupSpec() {
hibernateDatastore = new HibernateDatastore(RegistrationCode)
timestamper = hibernateDatastore.getAutoTimestampEventListener()
}
@Transactional
@Rollback
void 'some test method'() {
when:
timestamper.withoutDateCreated(MyDomainClass) {
MyDomainClass mdc = new MyDomainClass(name:"foo")
mdc.dateCreated = new Date() - 20
}
then:
MyDomainClass.findByName("foo").dateCreated < new Date()
}
}