联合主键的关系表建立PO使用
2010-06-28 22:25
441 查看
新闻与发送单位之间是 多对多 关系。中间表(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 将多对多关系设成一对多
<set
name="receivers"
table="ISOAT17"
lazy="true"
cascade="none"
sort="unsorted"
>
<key
column="NEWSID"
>
</key>
<one-to-many
class="com.shtobacco.es.xx.po.NewsReceiver"
/>
</set>
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配置文件 有多对一关系,本例未使用到
<?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-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>
</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
总结:将多对多关系
设成与关系表之间的一对多关系,简化查询关联的表(两表查询),提高查询效率。应用于只是查询 多对多 关系数据的情况。
中间表字段
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 将多对多关系设成一对多
<set
name="receivers"
table="ISOAT17"
lazy="true"
cascade="none"
sort="unsorted"
>
<key
column="NEWSID"
>
</key>
<one-to-many
class="com.shtobacco.es.xx.po.NewsReceiver"
/>
</set>
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配置文件 有多对一关系,本例未使用到
<?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-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>
</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
总结:将多对多关系
设成与关系表之间的一对多关系,简化查询关联的表(两表查询),提高查询效率。应用于只是查询 多对多 关系数据的情况。
相关文章推荐
- 解决使用Hibernate QBC复合查询含有联合主键映射关系实体的问题
- 第7章-使用ORM类库Mongoose提升你的Node.js数据-7.6.使用population建立关系和连接
- Sping中可以使用property的ref属性建立bean之间的引用关系
- 从一个审批需求看数据库设计——联合主键的使用
- JPA联合主键的使用
- Java--批量插入更新在一条sql里解决-mybatis-mysql-联合主键(建立唯一索引)
- spring-data-jpa使用联合主键后出现operand should contain 1 column(s)
- 调用Https WebService发布后使用时报“基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系”证书验证失败的解决过程(3)
- 联合主键建立方法
- Android sqlite联合主键的使用
- 剖析使用物理端口建立的BGP关系(实验部分)
- 备份构造函数与赋值函数,可联合使用建立某一个给定链表的备份???
- 使用Navicat逆向建立Mysql数据模型 -- 高效记忆数据逻辑关系
- JPA联合主键的使用(@EmbeddedId+@Embeddable)
- 使用SVCUTIL生成客户端代理类时:元数据包含无法解析的引用:“https: 无法为 SSL/TLS 安全通道与颁发机构“localhost”建立信任关系。基础连接已经关闭: 未能为 SSL/TL
- Hibernate使用联合主键,非主键自增
- Hibernate 使用Annotation之联合主键
- hibernate联合主键的使用
- Hibernate关系映射(5)_一对一单向联合主键关联
- spring jpa使用联合主键