攻城狮在路上(壹) Hibernate(八)--- 映射Hibernate组成关系
一、使用组成关系的原则:
在不导致数据冗余的前提下,尽可能减少数据库表的数目及表之间的外键参照关系,因为建立多个表的连接是很耗时的操作。
举例说明:Customer类中的Address属性,可以通过组件的方式来映射,避免了额外建立一张ADDRESS表,还能达到对象化操作的目的。
配置文件:
1
2
3
4
5
6
7 |
<component name= "homeAddress"
class = "mypack.Address" > <parent name= "customer"
/> <property name= "province"
type= "string"
column= "HOME_PROVINCE" /> <property name= "city"
type= "string"
column= "HOME_CITY" /> <property name= "street"
type= "string"
column= "HOME_STREET" /> <property name= "zipcode"
type= "string"
column= "HOME_ZIPCODE" /> </component> |
说明:
1
2
3 |
name:设定被映射的持久化类的属性名。 class :设定homeAddress属性的类型。 <parent>:指定Address类所属的整体类。 |
注意:区分是否存在组成关系。Hibernate组件Address没有OID。
1、区分
值类型和实体类型:
Hibernate组件Address没有OID,因此不能通过Session来单独保存、更新、删除或加载一个Address对象。当使用以下方法时:
1
2
3
4 |
session.load(Address. class , new
Long( 1 )); session.save(address); session.update(address); session.delete(address); |
会抛出org.hibernate.MappingException:Unknow entity class:
xx.xxx.Address。
值类型没有OID,不能被单独持久化,它的生命周期依赖于所属的持久化类的对象的生命周期。
二、映射复合组成关系:
一个Hibernate组件可以包含其他的Hibernate组件,获取其他实体类关联。
配置文件同上,仅是在component中嵌套一个component即可。
三、Hibernate组件总结:以Address为例
1、没有OID,在数据库中没有对应的表。
2、不需要单独创建Address类的映射文件。
3、不能单独持久化Address对象。Address对象的生命周期依赖于其整体类对象的生命周期。
4、其他持久化类不允许关联Address类。
5、Address类可以关联其他持久化类。
6、在component元素中还可以嵌套component元素,用于映射复合组成关系。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。