SSH-Hibernate(二)―映射关系(下)
来源:程序员人生 发布时间:2015-01-16 08:24:00 阅读次数:3484次
前面已讲了1对1和1对多关系使用Hibernate的映照。还剩下多对多关联和继承映照没有讲,这篇博客是想把这两个1块都总结了。
多对多表关系
关系型数据库没法直接表达多对多的关系,需要引入中间表之外键关联的方式来表达。以下图:
多对多单向关联映照
单向多对多关联映照,是在其中1端加入1个属性保存另外一真个对象集合。而在另外一端则不需要。看到这里你可能会有疑问,这不是和1对多关联1样吗?我们以在Categories1端作为持有者来看。
看到这个类图确切是和1对多关联里的单向映照方式没有区分。我们接着再看它的配置方式:
<class name="Category" table="t_category">
<id name="category_id">
<generator class="native"/>
</id>
<property name="category_name"/>
<set name="items" table="t_catetory_item">
<key column="item_id"/>
<many-to-many class="Item" column="item_id"/>
</set>
</class>
<class name="Item" table="t_item">
<id name="item_id">
<generator class="native"/>
</id>
<property name="item_basePrice"/>
</class>
从配置方式里可以看见和1对多关系映照的区分在于:对应了中间表t_category_item。也就是说category持有的item不是直接持有,而是通过了中间的关系去对应持有的对象有甚么。而1对多关联由于其中1端来讲是唯1的,则可以直接持有。
多对多双向关联
双向关联就是两端都持有对方,看过了1对多的双向和前面的单向多对多应当很容易理解了。这里就不再多说,看看类图和配置吧。
<class name="Category" table="t_category">
<id name="category_id">
<generator class="native"/>
</id>
<property name="category_name"/>
<set name="items" table="t_catetory_item">
<key column="item_id"/>
<many-to-many class="Item" column="item_id"/>
</set>
</class>
<class name="Item" table="t_item">
<id name="item_id">
<generator class="native"/>
</id>
<property name="item_basePrice"/>
<set name="categories" table="t_catetory_item">
<key column="category_id"/>
<many-to-many class="Item" column="category_id"/>
</set>
</class>
继承映照
继承关系的映照呢看上去和之前的好像很不同,这里为了帮助理解需要说明1点。之前我们讨论映照关系都是从关系型数据库的角度动身,以类之间的关系去表达数据之间的关系。这在理解上没有甚么问题,但是放在继承映照里就有问题了,由于数据库中其实不存在继承关系。所以,我们要换个角度了,以关系型数据库来表达类的继承关系。我们先看类图:
3种映照方式
- 使用 subclass 进行映照:将每个实体对象映照到1个独立的表中,也就是说不用在关系数据模型中斟酌继承关系和多态。
- 使用 joined-subclass 进行映照: 对继承关系中的子类使用同1个表,这就需要在数据库表中增加额外的辨别子类类型的字段。
- 使用 union-subclass 进行映照:每一个类映照到1个表,通过关系数据模型中的外键来描写表之间的继承关系。这也就相当于依照类的结构来建立数据库中的表,并通过外键来建立表之间的继承关系。
这里就不写如何配置了,太长了。
总结:映照关系的学习到了这里就告1段落了,总结以下:
第1,关系映照的动身点应当是:如何在关系型数据库中表达,类之间的关系。使关系型数据库对象化。
第2,所有的映照关系的本质都是:在哪个对象里作为属性保存有另外一个的对象或对象集合
第3,对数据的访问的方向是:谁持有谁就是访问入口
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠