all-delete-orphan, 支持删除孤儿数据。
Graphs of objects
要保存或者更新一个对象关联图中所有的所有对象,你必须做到:
-
保证每一个对象都执行save(), saveOrUpdate() 或 update()方法,或者,
-
在定义关联对象的映射时,使用cascade="all"或cascade="save-update"。
类似的,要删除一个关系图中的所有对象,必须:
-
对每一个对象都执行delete(),或者
-
在定义关联对象的映射时,使用cascade="all",cascade="all-delete-orphan"或cascade="delete"。
建议:
-
如果子对象的生命期是绑定到父对象的生命期的,通过指定cascade="all"可以把它变成一个自动管理生命周期的对象(lifecycle object)。
-
否则,必须在应用程序代码中明确地执行save()和delete()。如果你想少敲一些代码,可以使用cascade="sve-update",然后只需明确地delete()。
对一种关联(多对一,或者集合)使用cascade="all"映射,就把这种关联标记为一种父/子(parent/child)风格的关系,对父对象进行保存/更新/删除会导致对(所有)子对象的保存/更新/删除。但是这个比喻并不是特别确切。如果父对象解除了对某个子对象的关联,那这个子对象就不会被自动删除了。除非这是一个一对多的关联,并且标明了cascade="all-delete-orphan"(所有-删除-孤儿)。级联操作的精确语义在下面列出:
-
如果父对象被保存,所有的子对象会被传递到saveOrUpdate()方法去执行
-
如果父对象被传递到update()或者saveOrUpdate(),所有的子对象会被传递到saveOrUpdate()方法去执行
-
如果一个临时的子对象被一个持久化的父对象引用了,它会被传递到saveOrUpdate()去执行
-
如果父对象被删除了,所有的子对象对被传递到delete()方法执行
-
如果临时的子对象不再被持久化的父对象引用,什么都不会发生(必要时,程序应该明确的删除这个子对象),除非声明了cascade="all-delete-orphan",在这种情况下,成为“孤儿”的子对象会被删除。