`
caoxiping
  • 浏览: 29892 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate 关系映射 多对一 一对一 一对多 单双向

阅读更多
###1 <many-to-one name="group" column="groupid" />
many-to-one标签 会在多的一端加一个外键指向一的一端 name和属性名一致 column 是数据库字段名 指向一端的主键
cascade="all" delete update ... 采用cascade会级联操作主表User所引用的Group对象

###2<one-to-one>主键关联 默认了cascade属性 (双向 要互相持对方引用)
IdCard
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<one-to-one name="person"/>

Person
<id name="id">
<generator class="foreign">
   <param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<one-to-one name="idCard" constrained="true"/> //constrained表示 当前的主键上存在一个约束(Person的主键做为外键参照了idCard)

one-to-one 标签含义,指示Hibernate如何加载其引用对象 默认以主键加载(当前类的主键到idCard中的主键找对应的)

###3<one-to-one>唯一外键关联
IdCard
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<one-to-one name="person" property-ref="idCard"/>
//批示Hibernate如何加载其引用对象,默认以person的主键加载,这里要以person的idCard对应的键进行加载

Person
<id name="id">
<generator class="native"/> //不用主键做外键,它可以有自己的生成策略了
</id>
<property name="name"/>
<many-to-one name="idCard" unique="true"/> //多的一端加unique "多"的一端 就唯一了

###4 <one-to-many>
一对多关联 在多的一端加一个外键指向一的一端 维护的是 一到多 的关系 (与多对一关联一至,只是角度不同)

Classes
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!--
<set name="students" inverse="true" cascade="all"> //加cascade则在存classes时会级联存student;inverse主要用在一对多和多对多关联上
-->
<set name="students" inverse="true"> //在多的一端(student的一端)加一个外键 inverse 关系反转,表明关系靠对端("多"端)
// 即 存class时不会保存它的set中的students 而存student时 会保存它的classes对象 存class时 它不知道有 studens(关系反转了)
<key column="classesid"/>     //在多一端 加一个外键,指向它自身(这里指Classes)
<one-to-many class="com.hibernate.Student"/> //表明students中 存的实体对象类型 使Hibernate找Student.hbm.xml
</set>
Student
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="classes" column="classesid"/> //classesid 与 "一"端指定的字段一致 要与一对多中 key 指定的名字一致

###5<many-to-many>
多对多关联映身 通过中间表维护

User //单向时User映身写法
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>

Role
<id name="id">
<generator class="native"/>
</id>
<property name="name">
<set name="users" table="t_user_role" order-by="userid"> //table 创建第三方表 set无序 order-by 可以排序
<key column="roleid"/> //column 含意是 在多的一端添加一个外键指向自身(在表中加一个字段,引用Role表的主键)
<many-to-many class="com.hibernate.User" column="userid"/>
</set>

User //双向时User映身写法
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roles" table="t_user_role"> //table 要与另一端定义中间表名字一致
<key column="userid"/>
<many-to-many class="com.hibernate.Role" column="roleid"/>
</set>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics