级联操作
在映射文件中的关联元素中都有一个cascade属性,用来指定如果操纵与当前对象关联的其他对象。eg: cascade="all"
none: 在保存,更新,删除当前对象的时候忽略其他关联的对象。是cascade的默认值
save-update: 当通过Session的save(),update(),saveOrUpdate()方法来保存或者更新当前对象的时候级联保存所有关联的临时对象,级联更新所有关联的游离对象。
delete: 当通过Session的delete()方法删除当前对象的时候级联删除所有关联的对象。
all:包含save-update和delete的行为。
delete-orphan:删除所有和当前对象解除关联关系的对象。(只能在set中配置)
all-delete-orphan: 包含all和delete-orphan的行为
customer.getOrders.add(order1);
order1.setCustomer(customer);
inverse:负责控制关系
默认inverse="false" 只能显示在<set>放进行设置
inverse真正的作用是指定由哪一方来维护之间的关联关系,当一方指定inverse="false"那么这一方就有责任负责之间的关联关系。.需要将其中的一方inverse="true"
在一对多关系中,如果使用默认的inverse,那么意味着双方都可以维护关联关系,也就说在代码中可以仅仅用主方来维护从方,也可以用从方来维护主方,如果双向维护将会有一次重复更新。
在多对多关系中,如果用双方的外键来作为桥表的主键,只能一方来维护关联关系,意味着必须要将其中的一方设置为inverse="true",不然将会造成主键冲突的异常。
如果在配置中没有更改默认值,这时可以仅仅用主方来维护从方,也可仅仅用从方来维护主方!(如果配合级联使用,即对主方对象的操作要级联从方对象,那应该用主方来维护从房,反之亦然)。
如果我们将<set>元素中 inverse显式设置为inverse="true",这时候意味主方对象不能维护关联关系,所以只能通过从方对象来维护。
<set inverse="true" cascade="all">
主方不能维护关系,即使set集合中有数据,最后在插入数据库的时候,从方对象的外键也不能插入
Order
order.getLines.add(line)
session.save(order)
line ( order_id)