在Hibernate中,针对持久化实体的配置文件中有Cascade这样一个属性,顾名思义就是级联,也就是说在操作当前实体时,针对当前实体的操作会影响到相应配置的关联实体。比如针对当前实体进行保存操作时,会同时保存与其关联的实体,当然这种额外操作的产生取决于你是否在当前实体的配置文件中对关联实体的元素配置了Cascade属性。而需要进行级联的操作可能涉及到增加,修改,删除等相应的数据库操作,具体Cascade的取值则分为多种,如all,表示针对所有操作都会进行级联,如save-update,表示针对插入和修改会进行级联操作。对于Cascade的取值问题需要根本具体需求而定,这里没有一个统一的标准应该取怎样的值符合你的需要。从现实需求分析来决定应该如何取值。
这篇博文的主要目的当然不是在这里说明应该Cascade的取值问题,而是想在这研究讨论在进行级联删除操作时,在不同的关联关系中,级联删除的不同行为。我们知道对于关联关系的种类来说,主要分为一对一,一对一,一对多这三种,经过研究实践,我发现在Hibernate中,针对级联的操作针对不同的关联关系会有不同的行为表现。
在一对一关联关系中,当删除当前实体时,会同时级联删除关联实体,以解除两者的关联关系。
在一对多关联关系中,当删除一方实体时,会同时级联删除多方实体,以解除两者的关联关系。
在多对多关联关系中,根据我们对于多对多关联关系的不同处理情况,相应的级联删除行为会有所不同,如果将多对多的关联关系处理为两个一对多的关联关系时,也就是说这时存在一个中间实体用以表明两者的多对多关联关系,那么在删除其中一方实体时,相应的级联删除操作并不会直接删除中间实体,也就是两者的关联关系,而是在中间实体中将其中一方设置为NULL,这样两者的关联关系就相应的解除了,而如果我们将多对多关联关系不作特殊处理,将之当作纯粹的多对多关联关系,也就是说没有相应的中间实体,而只是在数据库中保持一个中间表来维护两者的关联关系,那么当我们在删除一方实体时,会相应的将数据库中的中间表的相应数据给直接删除掉。
上传的附件是我为上述各种处理情况写的一个DEMO,里面有详细的测试,运行测试即可轻易得出上述结论,在此供大家参考批评指正。