联合主键的关系表建立PO使用

新闻与发送单位之间是 多对多 关系。中间表(ISOAT17) 包含两主键关联ID,是联合主键。

中间表字段
Name Code Data Type Primary Foreign Key Mandatory
新闻编 号 NEWSID BIGINT TRUE TRUE TRUE
单位编号 CORPID BIGINT TRUE TRUE TRUE
 
将新闻与中间表改成一对多关系,通过中间表查询(得到单位ID),减少再关联单位表查询引起的效率问题,用于不获取单位具体信息情况
1 新闻PO
Long id;
String content;
Set receivers;//发送单位
    /**
     * 公司
  * @return Returns the receivers.
  * @hibernate.collection-one-to-many class="com.shtobacco.es.xx.po.NewsReceiver"
  * @hibernate.collection-key column="NEWSID"
  * @hibernate.set table="ISOAT17" lazy="true" cascade="none" 
  */
 public Set getReceivers() {
  return receivers;
 }
...
}
新闻hibernate.xml 将多对多关系设成一对多
            name="receivers"
            table="ISOAT17"
            lazy="true"
            cascade="none"
            sort="unsorted"
        >
                            column="NEWSID"
            >
           
                              class="com.shtobacco.es.xx.po.NewsReceiver"
            />
       
 
2建立联合主键类,无映身文件
public class NewsReceiverId implements Serializable{
 private RecentNews news
 private Long corpID;
...
}
3建立中间表PO,包含联合主键类
 * @hibernate.class table="ISOAT17" lazy="true" dynamic-insert="true"
 *                  dynamic-update="true"
 */
public class NewsReceiver implements Serializable {
 
 private NewsReceiverId id;
 /**
  * @hibernate.id
  * @return
  */
 public NewsReceiverId getId() {
  return id;
 }
 public void setId(NewsReceiverId id) {
  this.id = id;
 }
}
中间表PO配置文件 有多对一关系,本例未使用到
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    " http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd ">

            name="com.shtobacco.es.xx.po.NewsReceiver"
        table="ISOAT17"
        lazy="true"
        dynamic-update="true"
        dynamic-insert="true"   
    >
    
          
          
   
 
 
 
4 DAO中调用HQL写法
from RecentNews as rb left join rb.receivers as nr(中间表PO) where nr.id.corpID= 1  or nr.id.corpID is Null
总结:将多对多关系  设成与关系表之间的一对多关系,简化查询关联的表(两表查询),提高查询效率。应用于只是查询 多对多 关系数据的情况。

你可能感兴趣的:(联合主键的关系表建立PO使用)