Grails 1.1 持久化基础 - 级联更新和删除

在使用GORM时,理解如何级联更新和删除是很重要的.需要记住的关键是 belongsTo 的设置控制着哪个类"拥有"这个关联.

无论是一对一,一对多还是多对多,如果你定义了 belongsTo ,更新和删除将会从拥有类到被它拥有的类(关联的另一方)级联操作.

如果你 没有 定义 belongsTo 那么就不能级联操作,你将不得不手动保存每个对象.

下面是一个例子:[code]class Airport {
String name
static hasMany = [flights:Flight]
}

class Flight {
String number
static belongsTo = [airport:Airport]
}[/code]如果我现在创建一个 Airport 对象,并向它添加一些 Flight 它可以保存这个 Airport 并级联保存每个flight,因此会保存整个对象图:new Airport(name:"Gatwick") .addToFlights(new Flight(number:"BA3430")) .addToFlights(new Flight(number:"EZ0938")) .save()相反的,如果稍后我删除了这个 Airport 所有跟它关联的 Flight也都将会被删除:def airport = Airport.findByName("Gatwick") airport.delete()然而,如果我将 belongsTo 去掉的话,上面的级联删除代码就了. 不能工作. 为了更好地理解,take a look at the summaries below that describe the default behaviour of GORM
with regards to specific associations.

设置了belongsTo的双向一对多class A { static hasMany = [bees:B] } class B { static belongsTo = [a:A] }如果是双向一对多,在多的一端设置了belongsTo,那么级联策略将设置一的一端为"ALL",多的一端为"NONE".

单向一对多class A { static hasMany = [bees:B] } class B { }如果是在多的一端没有设置belongsTo单向一对多关联,那么级联策略设置将为"SAVEUPDATE".

没有设置belongsTo的双向一对多class A { static hasMany = [bees:B] } class B { A a }如果是在多的一端没有设置belongsTo的双向一对多关联,那么级联策略将为一的一端设置为"SAVE-UPDATE" 为多的一端设置为"NONE".

设置了belongsTo的单向一对一class A { } class B { static belongsTo = [a:A] }如果是设置了belongsTo的单向一对一关联,那么级联策略将为有关联的一端(A->B)设置为"ALL",定义了belongsTo的一端(B->A)设置为"NONE".