一.概念
- 现有一场景:一个管理员可以管理多个网吧,一个网吧可以被多个管理员管理。从中抽象出一个多对多的例子user-bar。
- 主控方user:多对多里面里面会有第三张表user_bar,由主控方维护这里面的外键记录,也就是创建一个user的时候必须指定其管理的bar。
- 被控方bar:没有权利更新外键记录。单独创建一个bar,不需要也不能指定其属于哪个user。
二. CascadeType
- CascadeType.MERGE:级联更新。创建一个user的时候,指定其管理哪些bar,如果某一个bar不存在,会在创建user的时候一起创建。
- CascadeType.PERSIST:级联保存。创建一个user的时候,指定其管理哪些bar,如果某一个bar不存在,抛出异常。所以指定其管理哪些bar必须是事先存在的。
- CascadeType.REMOVE:级联删除。删除一个user的时候,会删除它管理的bar,最终是user_bar里面删了,bar里面也删了。如果不指定CascadeType.REMOVE,只删user_bar里面。
- CascadeType.REFRESH:级联刷新。第一次查询某一user和第二次查询同一user之间,删除了某一bar,CascadeType.REFRESH是的任何时候看到的都是最新的记录(两次查询结果不一样)。
- CascadeType.ALL:包含以上所有。
三. 使用
- 根据具体的场景要指定不同的Type。
- user和bar之间的关系,并没有说user不存在了,网吧就不存在,所以不能用CascadeType.REMOVE。
- 保存一个user的时候,指定他能够管理的网吧必须是已经存在的,所以CascadeType.MERGE和CascadeType.PERSIST中用CascadeType.MERGE。
四. 吐槽
第一次接触CascadeType,去网上找资料的时候,NM,全部是一样的文章,甚至连错误都是一起copy过去的,真不赞同这样的学习方式。