关系映射

本文详细介绍了Hibernate中的关联映射,包括Many2One、One2Many、inverse属性、级联操作、延迟加载和Open Session In View等。通过实例解析了各种配置选项,如cascade、order-by、lazy属性等,帮助理解如何维护类之间的关联关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.关联关系:类与类之间最普遍的关系
1.1Hibernate关联映射
1.1.1Many2One
配置:
<!--配置多对一单向关联
    name:一的一方在多的一方的属性名
    cloumn:在t_emp表中生成的列名(外键列)
-->
<many-to-one name="dept" column="dept_id"/>
---实际使用中:一定要先添加一的一方再添加多的一方
2.One2Many
 <!--配置一对多关联映射
        name:多的一方在一的一方中的属性名称
        -->
        <set name="comments">
            <!--自己(一的一方)在对方(多的一方)中的列名-->
            <key column="msg_id"/>
            <!--指定多的一方的类-->
            <one-to-many class="Comment"/>
        </set>
   ---实际应用中,尽量不要使用一的一方去维护关系
--会多发sql
--代码不方便维护
 cascade:级联操作
        (在未操作时,不会删除数据,只是会将外键置空
        设置之后,会将有外键关联的数据删除掉)


cascade属性值:
none:当session操纵当前对象时,忽略其他关联的对象,它是cascade属性的默认值
save-update:当通过Session的save(),update()及saveOrUpdate()方法来保存或更新当前对象时,级联宝尊
所有关联的新建的瞬时状态的对象,并且更新所有关联的游离状态的对象
delete:当通过Session的delete()方法删除当前对象时,会级联删除所有的对象


inverse属性:
inverse属性指定了关联关系中的方向
  inverse设置为false,则为主动方,由主动方负责维护关联关系,默认是false
  inverse设置为true,不负责维护关联关系
  inverse:当设置为true时表示将关系交由对方(多的一方)来维护
①在建立两个对象的双向关联时,应该同时修改两个关联对象的相关属性
②建议inverse设置为true
尽量让多的一方来维护关系
3.order-by属性用于在数据库中集合排序
order-by:获取多的一方时进行排序
eg:  <!--配置一对多关联映射
        name:多的一方在一的一方中的属性名称
        cascade:级联操作
        (在未操作时,不会删除数据,只是会将外键置空
        设置之后,会将有外键关联的数据删除掉)
        inverse:当设置为true时表示将关系交由对方(多的一方)来维护
        order-by:获取多的一方时进行排序
        -->
        <set name="comments" cascade="all" inverse="true" order-by="content asc">
            <!--自己(一的一方)在对方(多的一方)中的列名-->
            <key column="msg_id"/>
            <!--指定多的一方的类-->
            <one-to-many class="Comment"/>
        </set>
4.延迟加载(lazy load懒加载):
是当真正需要数据时,才执行sql语句进行查询。避免了无畏的开销
①类级别的查询策略


lazy属性值:
  true---延迟加载
  false---立即加载 
②一对多和多对多关联的查询策略
  true---延迟加载
  false---立即加载
  extra---加强延迟加载
③多对一关联的查询策略
eg:
<!--配置一对多关联映射
        name:多的一方在一的一方中的属性名称
        cascade:级联操作
        (在未操作时,不会删除数据,只是会将外键置空
        设置之后,会将有外键关联的数据删除掉)
        inverse:当设置为true时表示将关系交由对方(多的一方)来维护
        order-by:获取多的一方时进行排序
        lazy:extra(会智能一些,根据用户最终使用的需求来确定发送怎样的sql)
        -->
        <set name="comments" cascade="all" inverse="true" order-by="content asc" lazy="extra">
            <!--自己(一的一方)在对方(多的一方)中的列名-->
            <key column="msg_id"/>
            <!--指定多的一方的类-->
            <one-to-many class="Comment"/>
        </set>
5.Open Session In View:
在用户的每一次请求过程中始终保持一个Session对象打开着


ThreadLocal:线程变量
OpenSessionInView:
  --使用过滤器,在请求前开启session,开启事务
  --在请求后提交或者回滚事务,在关闭session


6.Many2Many
   --admin.hbm.xml
     <!--配置多对多关系映射-->
        <set name="roles" table="t_admin_role">
            <key column="admin_id"/>
            <many-to-many class="Role" column="role_id"/>
        </set>
   --role.hbm.xml
   <!--配置多对多关系映射-->
          <set name="admins" table="t_admin_role">
              <key column="role_id"/>
              <many-to-many class="Admin" column="admin_id"/>
          </set>
   
相关异常:  
Caused by: java.sql.SQLException: Field 'id' doesn't have a default value
 --出现这种异常时,将原有的表删除然后在运行程序。








IDEA快捷键:
Ctrl+D:复制当前行(光标定位到当前行)
Ctrl+X:删除当前行
Shift+Alt+↑:移动当前行至上一行
Shift+Alt+↓:移动当前行至下一行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值