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


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Hibernate多对一双表关联配置属性理解)