<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的使用是有前提的,必须保证多对一关系,或者使用外键保证,或者你想其他办法保证。