Hibernate的上篇博客写了一对一关联,这篇我们说一下一对多关联。入门篇里我们说过,Hibernate的关联关系对应的是关系型数据库中的表记录之间的关系。换句话说就是以类间的关联关系,来保存或者说映射记录的关系,因为关联关系里的一对一,一对多,多对多描述的是对象(对象即记录)数量的关系。记住这一点应该是有助于理解的。
总结:一对多关联的三种映射方式,区别只在于谁持有了谁。即,作为自己的一个属性保存与其关联的对象实例。
表关系图
这张图表达的是:客户表和订单表中的记录,一个客户(即一个Customers)对应多个订单(Orders)。但是一个订单记录只能对应一个客户。类图
从这个表关系转化到类图可以有三种不同的表示方式:
- 在Order端持有的客户的一对多关系,即从订单出发到客户的单向关联。这里从Order的方向出发,则客户对其来说是唯一的,所以只要在属性里加入一个Customer的属性直接持有对应的客户。
- 在客户端持有订单集合的一对多关系,即从客户出发到订单的单向关联。这时候从Customer出发的话,其“可视”的订单是多个的。所以这里需要在属性里加入一个集合来保存客户对应的订单。
- 以上两种关系,都只能从持有的一端作为访问入口。第三种则是,双向持有。即从哪一端出发都可以拿得到对应关系的对象。
对应的Hibernate配置
1. Order→Customer
<span style="font-family:FangSong_GB2312;font-size:18px;"> 多端
<hibernate-mapping>
<!--类和表之间的映射-->
<class name="com.tgb.hibernate.Order" table="t_order">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="customer" column="customerId"/>
</class>
</hibernate-mapping>
一端
<hibernate-mapping>
<class name="com.tgb.hibernate.Customer" table="t_customer">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
</span>
2. Customer→Order
<span style="font-family:FangSong_GB2312;font-size:18px;"> 多端
<hibernate-mapping>
<class name="com.tgb.hibernate.Order" table="t_order">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
一端
<hibernate-mapping>
<class name="com.tgb.hibernate.Customer" table="t_group">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="orders" inverse="true" cascade="all">
<key column="customer_id" ></key>
<one-to-many class="com.tgb.hibernate.Order"/>
</set>
</class>
</hibernate-mapping> <span style="background-color: rgb(255, 255, 255);"> </span></span>
3. 双向关联
<span style="font-family:FangSong_GB2312;font-size:18px;"> 多端
<hibernate-mapping>
<!--类和表之间的映射-->
<class name="com.tgb.hibernate.Order" table="t_order">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="customer" column="customerId"/>
</class>
</hibernate-mapping>
一端
<hibernate-mapping>
<class name="com.tgb.hibernate.Customer" table="t_group">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="orders" inverse="true" cascade="all">
<key column="customer_id" ></key>
<one-to-many class="com.tgb.hibernate.Order"/>
</set>
</class>
</hibernate-mapping> </span>
总结:一对多关联的三种映射方式,区别只在于谁持有了谁。即,作为自己的一个属性保存与其关联的对象实例。