首页 > 代码库 > SSH-Hibernate(二)—映射关系(中)

SSH-Hibernate(二)—映射关系(中)

    Hibernate的上篇博客写了一对一关联,这篇我们说一下一对多关联。入门篇里我们说过,Hibernate的关联关系对应的是关系型数据库中的表记录之间的关系。换句话说就是以类间的关联关系,来保存或者说映射记录的关系,因为关联关系里的一对一,一对多,多对多描述的是对象(对象即记录)数量的关系。记住这一点应该是有助于理解的。

表关系图

    这张图表达的是:客户表和订单表中的记录,一个客户(即一个Customers)对应多个订单(Orders)。但是一个订单记录只能对应一个客户。
技术分享

类图

    从这个表关系转化到类图可以有三种不同的表示方式:

    1. 在Order端持有的客户的一对多关系,即从订单出发到客户的单向关联。这里从Order的方向出发,则客户对其来说是唯一的,所以只要在属性里加入一个Customer的属性直接持有对应的客户。技术分享
    2. 在客户端持有订单集合的一对多关系,即从客户出发到订单的单向关联。这时候从Customer出发的话,其“可视”的订单是多个的。所以这里需要在属性里加入一个集合来保存客户对应的订单。技术分享
    3.  以上两种关系,都只能从持有的一端作为访问入口。第三种则是,双向持有。即从哪一端出发都可以拿得到对应关系的对象。
技术分享

对应的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>

    总结:一对多关联的三种映射方式,区别只在于谁持有了谁。即,作为自己的一个属性保存与其关联的对象实例。

SSH-Hibernate(二)—映射关系(中)