Hibernate 关系映射 多对一 一对一 一对多 单双向
###1<many-to-onename="group"column="groupid"/>
many-to-one标签会在多的一端加一个外键指向一的一端name和属性名一致column是数据库字段名指向一端的主键
cascade="all"deleteupdate...采用cascade会级联操作主表User所引用的Group对象
###2<one-to-one>主键关联默认了cascade属性(双向要互相持对方引用)
IdCard
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="cardNo"/>
<one-to-onename="person"/>
Person
<idname="id">
<generatorclass="foreign">
<paramname="property">idCard</param>
</generator>
</id>
<propertyname="name"/>
<one-to-onename="idCard"constrained="true"/>//constrained表示当前的主键上存在一个约束(Person的主键做为外键参照了idCard)
one-to-one标签含义,指示Hibernate如何加载其引用对象默认以主键加载(当前类的主键到idCard中的主键找对应的)
###3<one-to-one>唯一外键关联
IdCard
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="cardNo"/>
<one-to-onename="person"property-ref="idCard"/>
//批示Hibernate如何加载其引用对象,默认以person的主键加载,这里要以person的idCard对应的键进行加载
Person
<idname="id">
<generatorclass="native"/>//不用主键做外键,它可以有自己的生成策略了
</id>
<propertyname="name"/>
<many-to-onename="idCard"unique="true"/>//多的一端加unique"多"的一端就唯一了
###4<one-to-many>
一对多关联在多的一端加一个外键指向一的一端维护的是一到多的关系(与多对一关联一至,只是角度不同)
Classes
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<!--
<setname="students"inverse="true"cascade="all">//加cascade则在存classes时会级联存student;inverse主要用在一对多和多对多关联上
-->
<setname="students"inverse="true">//在多的一端(student的一端)加一个外键inverse关系反转,表明关系靠对端("多"端)
//即存class时不会保存它的set中的students而存student时会保存它的classes对象存class时它不知道有studens(关系反转了)
<keycolumn="classesid"/>//在多一端加一个外键,指向它自身(这里指Classes)
<one-to-manyclass="com.hibernate.Student"/>//表明students中存的实体对象类型使Hibernate找Student.hbm.xml
</set>
Student
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<many-to-onename="classes"column="classesid"/>//classesid与"一"端指定的字段一致要与一对多中key指定的名字一致
###5<many-to-many>
多对多关联映身通过中间表维护
User//单向时User映身写法
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
Role
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name">
<setname="users"table="t_user_role"order-by="userid">//table创建第三方表set无序order-by可以排序
<keycolumn="roleid"/>//column含意是在多的一端添加一个外键指向自身(在表中加一个字段,引用Role表的主键)
<many-to-manyclass="com.hibernate.User"column="userid"/>
</set>
User//双向时User映身写法
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<setname="roles"table="t_user_role">//table要与另一端定义中间表名字一致
<keycolumn="userid"/>
<many-to-manyclass="com.hibernate.Role"column="roleid"/>
</set>