我很难在Grails上找到正确的关联。假设我有两个域类:
class Engine {
String name
int numberOfCylinders = 4
static constraints = {
name(blank:false, nullable:false)
numberOfCylinders(range:4..8)
}
}
class Car {
int year
String brand
Engine engine = new Engine(name:"Default Engine")
static constraints = {
engine(nullable:false)
brand(blank:false, nullable:false)
year(nullable:false)
}
}
这个想法是用户可以在不创建引擎的情况下创建汽车,并且这些汽车获得默认引擎。在CarController我有:
def save = {
def car = new Car(params)
if(!car.hasErrors() && car.save()){
flash.message = "Car saved"
redirect(action:index)
}else{
render(view:'create', model:[car:car])
}
}
尝试保存时,我在Car.engine字段上得到一个空值异常,所以显然没有创建和保存默认引擎。我试图手动创建引擎:
def save = {
def car = new Car(params)
car.engine = new Engine(name: "Default Engine")
if(!car.hasErrors() && car.save()){
flash.message = "Car saved"
redirect(action:index)
}else{
render(view:'create', model:[car:car])
}
}
也没用。 Grails无法保存关联的类吗?我怎么能实现这样的功能?
答案 0 :(得分:3)
我认为你的引擎需要一个belongsTo,即
static belongsTo = [car:Car]
希望这有帮助。
答案 1 :(得分:2)
为了什么值得,我终于把它钉了。
我试图保存汽车时遇到的例外是
not-null属性引用null或 瞬态值
很明显,尝试保存时引擎为空,但为什么呢?事实证明你必须这样做:
def car = new Car(params)
car.engine = new Engine(name: "Default Engine")
car.engine.save()
由于引擎不属于Car,因此您不会获得级联保存/更新/删除,这在我的情况下很好。解决方案是手动保存引擎,然后保存汽车。