Grails - свойство not-null ссылается на нулевое или временное значение - PullRequest
0 голосов
/ 07 ноября 2011

У меня есть несколько основных доменных объектов Grails:

Задача Пользователь

Недавно я хотел иметь возможность назначать задачи нескольким пользователям. Поэтому я добавил этот код в класс Task.groovy:

static hasMany = [users: User]

static mapping = {
    users joinTable: [name: 'task_user', column: 'user_id', key: 'task_id']
}

Таким образом, Задача теперь может быть назначена нескольким пользователям, используя объединяющую таблицу - объединение Таблиц Задач и Пользователей. Теперь, когда я создаю новую задачу, она выдает мне сообщение об ошибке:

"свойство not-null ссылается на нулевое или временное значение: blah.User.address"

В сгенерированной таблице соединений "task_user" ему нужен только user_id из объекта User, поэтому я не понимаю, почему он жалуется на то, что другие пользовательские поля являются пустыми. Пользовательский объект всегда будет присутствовать в базе данных. Я не хочу полностью загружать каждого пользователя, чтобы создать новую задачу. Я почти уверен, что это как-то связано с каскадированием.

Мне нужно поведение, при котором, если задача удалена, соответствующая запись в таблице присоединения task_user должна быть удалена. Я "никогда" не хочу, чтобы пользовательский объект обновлялся / удалялся в результате сохранения задачи. Я не уверен, как поступить.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2011

Fix

Вам нужно использовать User.load (id), чтобы получить ссылку на объект пользователя. load в отличие от get не попадает в базу данных - он просто создает прокси, который можно использовать вместо объекта User. Пока доступ только к свойству id - db не доступен.

Объяснение ошибки, которую вы видите

В вашем коде вы создали новый пользовательский объект (временный), который не связан с Hibernate. Чтобы подключить его к hibernate, вам нужно либо сохранить его, либо добавить атрибут assign_to - оба они попытаются обновить строку в пользовательской таблице, установив для каждого поля значение null. Если это был новый пользовательский объект, который вы создавали и хотели, чтобы он был сохранен автоматически, вам нужно было бы установить принадлежность__ (~ к каскаду).

0 голосов
/ 08 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...