Grails findBy принадлежит, чтобы дать JdbcSQLException
Скажем, для системы у меня были объекты Student и User, например:
User {
}
Student {
User user //not nullable
static belongsTo = [User]
}
Teacher {
static belongsTo = [user:User]
}
У меня есть много кода, написанного для этих моделей, и много динамического поиска в нем
def u1 = new User().save( flush: true)
new Student( user: u1 ).save( flush: true)
...
def s = Student.findByUser( springSecurityService.currentUser)
//s can be null
def t = Teacher.findByUser( springSecurityService.currentUser)
//t can be null
if( s != null)
//do something with 's'
if( t != null)
//do something with 't'
...
И все это работало нормально. Но я хотел обновить модель своего домена, чтобы добавить каскадный доступ от пользователя к студенту. Так я и сделал:
User {
Student student //nullable
}
И я хотел бы сохранить пользователя, как это:
new User( student: new Student() ).save( flush: true)
Но проблема в том, что, когда я пытаюсь получить доступ к 's', как я делал выше.
Если Student.findByUser может найти одного такого студента, то он работает.
Но если он должен вернуть ноль, он выдаст ошибку.
def s = Student.findByUser( springSecurityService.currentUser)
приведет к:
org.h2.jdbc.JdbcSQLException
Parameter #2 is not set; SQL statement:
select this_.id as id18_0_, this_.version as version18_0_, from student this_ where this_.id=? limit ? [90012-173]
Я знаю, что могу получить доступ к объекту студента через пользовательский объект, такой как user.student, но я бы хотел сохранить существующий код таким, какой он есть.
Я видел эту ветку, и у нее была похожая проблема, но нет разрешения.
Это ошибка? Что я могу сделать, чтобы обойти это? Я не настраиваю свои доменные модели должным образом?
Спасибо
1 ответ
В качестве альтернативы, вы можете попробовать что-то вроде этого, используя hasOne
вместо belongsTo
,
class User {
static hasOne = [student:Student, teacher:Teacher]
static constraints = {
student unique:true, nullable: true
teacher unique:true, nullable: true
}
}
class Student {
User user
}
class Teacher {
User user
}
Это все еще каскады и, кажется, прекрасно обрабатывает нулевые поиски.