Hibernate多对一双表关联配置属性理解

         <many-to-one name="odsPhotoBack" 
          column="emp_id" 
          class="org.hd.login.model.OdsPhotoBack" 
          update="false" 
		  insert="false" 
		  cascade="none"
		  not-found="ignore"
		  lazy="no-proxy"
		  outer-join="true"
          not-null="true"/>
         <many-to-one name="manage_person" 
          column="manage_person" 
          class="org.hd.business.device.model.DeviceOwnerVo" 
          property-ref="emp_id"
          update="false" 
		  insert="false" 
		  cascade="none"
		  not-found="ignore"
		  lazy="no-proxy"
		  outer-join="true"
          not-null="true"/>



假设有table_a,

字段:aid,aname,ref_b_fk

对应pojo类VO_A。

属性:aId,aName,rEf_b_fk, (VO_B类型) vob

table_b,

字段:bid,bname,bother

对应pojo类VO_B。

属性:bId,bName,bOther

在VO_A的hibernate文件中配置

<many-to-one

name="vob"
column="ref_b_fk"
class="VO_B"
update="false"
insert="false"
cascade="none"
not-found="ignore"
lazy="no-proxy"
outer-join="true"
not-null="true"/>

其中column是数据库字段,不是pojo属性名。(虽然大部分情况下,我们把数据库字段和pojo属性名写的一样,但是还是要弄清楚这里写的是哪个值)

name就是主pojo即VO_A中的属性vob,这个属性类型是class="VO_B" 。

假如我们要查询VO_A列表(where条件这里就不写了),这个配置最后生成的sql是:

1,select * from table_a

2,根据1的结果集实行遍历,每条结果取出字段column="ref_b_fk" 的值就叫 temp_v_a,

然后select * from table_b where (table_b主键)=temp_v_a。这里默认就是以table_b中主键做关联的。

结果集必然是一条记录,这个记录对应类VO_B赋值给VO_A中的属性VO_B vob。

这样这个属性就有值了。

如果我们在两张表关联时,即select *from table_b where (table_b主键)=temp_v_a。不想让table_b中主键做关联,

那需要设置关联字段,使用property-ref="table_b某字段"。这样生成的sql就是


1,select * from table_a

2,根据1的结果集实行遍历,每条结果取出字段column="ref_b_fk" 的值就叫 temp_v_a,

然后select * from table_b where (table_b关联字段)=temp_v_a。

结果集必须是一条记录,这个记录对应类VO_B赋值给VO_A中的属性VO_B vob。

如果不能保证结果集是一条记录,那本身就不是VO_A(多)---VO_B(一)的映射关系。

要么你的逻辑设计有问题,要么你的数据库确实存在着垃圾数据破坏了这样的关系。

所以property-ref的使用是有前提的,必须保证多对一关系,或者使用外键保证,或者你想其他办法保证。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值