新闻与发送单位之间是 多对多 关系。中间表(ISOAT17) 包含两主键关联ID,是联合主键。
中间表字段
Name Code Data Type Primary Foreign Key Mandatory
新闻编 号 NEWSID BIGINT TRUE TRUE TRUE
单位编号 CORPID BIGINT TRUE TRUE TRUE
新闻编 号 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;
}
* 公司
* @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 将多对多关系设成一对多
<set
name="receivers"
table="ISOAT17"
lazy="true"
cascade="none"
sort="unsorted"
>
name="receivers"
table="ISOAT17"
lazy="true"
cascade="none"
sort="unsorted"
>
<key
column="NEWSID"
>
</key>
column="NEWSID"
>
</key>
<one-to-many
class="com.shtobacco.es.xx.po.NewsReceiver"
/>
class="com.shtobacco.es.xx.po.NewsReceiver"
/>
</set>
2建立联合主键类,无映身文件
public class NewsReceiverId implements Serializable{
private RecentNews news
private Long corpID;
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;
* dynamic-update="true"
*/
public class NewsReceiver implements Serializable {
private NewsReceiverId id;
/**
* @hibernate.id
* @return
*/
public NewsReceiverId getId() {
return id;
}
* @hibernate.id
* @return
*/
public NewsReceiverId getId() {
return id;
}
public void setId(NewsReceiverId id) {
this.id = id;
}
this.id = id;
}
}
中间表PO配置文件 有多对一关系,本例未使用到
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
" http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd ">
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
" http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd ">
<hibernate-mapping>
<class
name="com.shtobacco.es.xx.po.NewsReceiver"
table="ISOAT17"
lazy="true"
dynamic-update="true"
dynamic-insert="true"
>
<composite-id name="id" class="com.shtobacco.es.xx.po.NewsReceiverId" unsaved-value="any" >
<key-many-to-one name="news" column="newsID" class="com.shtobacco.es.xx.po.RecentNews" />
<key-property name="corpID" column="corpID" type="java.lang.Long" />
</composite-id>
</class>
<class
name="com.shtobacco.es.xx.po.NewsReceiver"
table="ISOAT17"
lazy="true"
dynamic-update="true"
dynamic-insert="true"
>
<composite-id name="id" class="com.shtobacco.es.xx.po.NewsReceiverId" unsaved-value="any" >
<key-many-to-one name="news" column="newsID" class="com.shtobacco.es.xx.po.RecentNews" />
<key-property name="corpID" column="corpID" type="java.lang.Long" />
</composite-id>
</class>
</hibernate-mapping>
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
总结:将多对多关系 设成与关系表之间的一对多关系,简化查询关联的表(两表查询),提高查询效率。应用于只是查询 多对多 关系数据的情况。
总结:将多对多关系 设成与关系表之间的一对多关系,简化查询关联的表(两表查询),提高查询效率。应用于只是查询 多对多 关系数据的情况。