都知道hibernate用xml方式配置关系时(one-to-many,many-to-many)可以添加控制反转属性 inverse=false(默认)
即将两表之间的关系交给对方来维护.
inverse=true表示本方不维护关系,有对方维护关系
但是需注意的是,one-to-one关系是没有控制反转的,只能交由外键来维护关系.
从而导致在设置关系时,只能有外键方设置,移除关系时,只能从外键方来解除关系,删除记录时,只能先删外键方,在删主键方(save,remove,delete)
如果有控制反转的话,就方便的多,两表之间可以互相设置关系,互相解除关系,删除时,删除主键方时,会将外键方的外键置为空值()不过这样不推荐)
那么在hiebernate注解方式下(在没有xml配置的情况下)是如何设置控制反转的,如何在onetoMany ,manytomany中相互设置关联了?
当然inverse对get/query没有任何影响
一般控制反转(维护关系)都交给多方(外建方)来维护,学生记教室容易,教室记学生麻烦
原则:
1.one-to-one不添加控制反转,由外键维护关系
2.由多方维护关系,
主表方不维护主键关系
<set name="employees" inverse="true">
<key column="departmentId"></key>
<one-to-many class="Employee"/>
</set>
子表方(外键方) many to one不设置inverse属性(默认为inverse=false) 你写了反倒会出错 同理在annotation中many to one也不能写mappedBy (默认都是由对方控制的)
在one-to-one 双向关联中 外键方维护关系
@JoinColumn(name=" ",unique=".") //设置外键 inverse=false
@OneToOne(cascade=CascadeType.ALL) @JoinColumn(name="pid",unique=true) public IdCard getIdCard() { return idCard; }
主键方mappedBy="子表外键对象" //inverse=true
many-to-many 有一方维护外键关系就行了
因此设置了一方关系 另一方@ManyToMany()不设置mappedBy就可以互相维护关系(但是不推荐)
mappedBy ===inverse=true
many-to-one 不写