关于hibernate中一对一和一对多的之中的误区整理

前几天在维护别人项目代码的时候遇到了一个需求的改动,一个报表查询功能,由原有的3张表(a,b,c)现在可能要查询4张表(a,b,c,d),原程序员的代码是用hql关联3个表,然后用等值连接进行查询,但是我在第四个表的时候实际情况需要用到left join,于是我没有做任何的改动,直接在原来的hql语句中写left join d表,结果我错了,hibernate根本就不认识,我又不想用sql把所有的字段都查询一遍,然后再set一遍,后来在hibernate中配置相关的一对一和一对多的代码,如下:

一对一配置(一的一端):a表:<one-to-one name="certOrderDetail" property-ref="corder"></one-to-one>

一对一配置(多的一端):b表:<many-to-one name="corder" column="CERT_ORDER_ID" unique="true" update="false" insert="false"></many-to-one>此处多的一方必须添加unique=true

一对多(一的一端):c表:<one-to-one name="certInfoDetail"  property-ref="corderDetail"></one-to-one>

一对多(多的一端):d表:<set name="certInfoDetail" fetch="join">
     <key column="CERT_ORDER_ID"></key>
     <one-to-many class="com.sxca.certapply.entity.CertInfoDetail"></one-to-many>
   </set>

需要注意的是:

1.a表中的CERT_ORDER_ID必须是主键,在b表中是外键,虽然在数据库设计上没有明确的设置外键,这里的配置在hibernate中相当于是设置了外键

2.一对多没什么可说的,只需注意这里如果用set的话,在实体里面也需要用set,这里用list的话,在实体里面也需要用list,否则会发生错误。

3.这里是我发现的一个误区,第二张表(b)和第三张表(c)关联的时候,我的实际情况是直接用两个的外键进行关联,结果坑爹的情况出现了,竟然是b表的主键和我c表的主键进行了关联,这里百思不得其解,经过措辞排查没有找到相应的问题,最后看到有人说外键与外键好像不能这么做,也没法做一对一,最后我彻底的放弃了,推翻了3天研究的这个坑所有的代码,半个小时用sql写了,希望能够帮助大家走出误区。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值