hibernate关联关系

一.一对一
1.基于外键的单向1-1,(Address不配置,为单向;若配置,则为双向)
以User和Address为例,主要配置如下:

User:

<many-to-one name="address" class="Address" column="addressId" cascade="all" unique="true"></many-to-one>

Address:

<!--Address:<one-to-one name="user" class="User" property-ref="address"></one-to-one>-->

其中,unique="true",表示N方唯一,每个User对象都有唯一的Address对象与之关联。
2.基于主键的双向1-1
以User和Address为例,主要配置如下:

User:

<one-to-one name="address" class="Address" cascade="all"></one-to-one>
    

Address:

<id name="id" column="addressId">
            <generator class="foreign">
                <param name="property">user</param>
            </generator>
        </id>

        <one-to-one name="user" class="User" constrained="true"></one-to-one>
   
其中,constrained="true",表示Address表的主键同时作为外键参考User表;另外,Address.hbm.xml文件,ID采用foreign生产策略,这样Hibernate就会保证Address对象与关联的User对象共享一个ID。
cascade="all"表示当保存、更新、删除User对象时,级联保存、更新、删除Address对象。
二.一对多
1.单向N-1
以Class和Student为例,

Student:

<many-to-one name="c" column="classId" class="Class" cascade="save-update"></many-to-one>

Class:
2.单向1-N

Class:

<set name="students" cascade="save-update" inverse="true">
            <key column="classId"></key>
            <one-to-many class="com.java1234.model.Student"/>
        </set>   
               
Student:
3.双向1-N

Student:

<many-to-one name="c" column="classId" class="Class" cascade="save-update"></many-to-one>

Class:

<set name="students" cascade="save-update" inverse="true">
            <key column="classId"></key>
            <one-to-many class="com.java1234.model.Student"/>
        </set>

其中,column="classId"设定与持久化类的属性对应的表的外键(即设定class表的外键),<key column="classId">设定关联表(student表)的外键,即Student表的classId列是引用Class表的外键,key的column属性指的是Student表的列名。
inverse="true"控制反转,表示关联关系由N方(Student)维护,默认由一方(Class)维护,一般加上inverse="true"这句话,hibernate在执行时不再执行update语句(这里Update语句用来更新student表中的classId属性)。列如,班级甲添加学生李四,李四却选择班级乙,若不配置inverse="true",李四是班级甲的学生,若配置了inverse="true",李四就是班级乙的学生。
三.多对多
1.单向N-N
以Student和Course为例

Student:

<set name="courses" table="student_course" cascade="save-update">
            <key column="student_id"></key>
            <many-to-many class="Course" column="course_id"></many-to-many>
        </set>

Course:
2.双向N-N
Student:
    
   <set name="courses" table="student_course" cascade="save-update">
            <key column="student_id"></key>
            <many-to-many class="Course" column="course_id"></many-to-many>
        </set>

Course:

<set name="students" table="student_course" inverse="true" >
            <key column="course_id"></key>
            <many-to-many class="Student" column="student_id"></many-to-many>
        </set>


多对多关联,第三个表用来记录ID,也可以添加额外属性。
四.自关联
     
  private Department parent;
  private Set<Department> children=new HashSet<Department>();
   
    <!-- parent属性,本类与Department(上级)的多对一 -->
        <many-to-one name="parent" class="Department" column="PARENTID" ></many-to-one>

        <!-- children属性,本类与Department(下级)的一对多 -->
        <set name="children" cascade="delete" order-by="id" >
            <key column="PARENTID"></key>
            <one-to-many class="Department" />
        </set>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值