hibernate中的inverse与cascade是个让人容易产生误解的属性,今天我终于有了正确的认识,总体上说inverse是指定哪个表作为维护端,cascade则是在操作某个表时,另一个表如何操作。
以Father与Son为例,它们之间为一对多关系。
一、inverse属性
1、如果是单向一对多
在set元素那里设置inverse为true,则插入father时(且调用father.setSons(sons),sons 是个set),son没有插入,如果设置inverse为false则插入father时(且调用father.setSons(sons),sons 是个set),则同时插入son。
2、如果是单向多对一
此种配置没有inverse属性,设置cascade为合适值即可实现级联操作。可等价于一对多中的inverse=false
3、双向一对多(与双向多对一是一样的)
set的inverse默认为false,当在一的一端的set中设置inverse为false时(many-to-one没有inverse属性,实际上就相当于many-to-one的"inverse"恒为false),调用session.save(),则将有2条update语句,实际上2条语句是一样的。此种设置方法是低效率的,因为执行来了2次实际上是一样的sql语句。通常将set中的inverse设置为true,这样当插入或更新时,只执行一次update语句。
在双向一对多时,set的inverse设置为true,则须注意:通过father.setSons(sons)是无法保证son插入的,而通过son.setFather(father)可以保证father插入,因而在程序中最后同时设置father.setSons(sons),son.setFather(father).
二、cascade属性
cascade表示某一端进行某种操作时,另一端的关联操作。cascade属性只有在inverse属性设置为false才有意义,因为inverse为true表示不维护关系,即外键为null,如果此时对某一端执行某种操作,hibernate无法找到相应的另一端,自然也就无法对另一端执行相应操作。