双向多对一和单向多对一唯一不同的地方是多对一的一那端增加了到多那端的映射关联,参照模型还是顾客(customer)-订单(order)



package com.demo.model.many2one.both;

import java.util.HashSet;
import java.util.Set;

public class Customer {

	private Integer id;
	private String name;
	
	private Set<Order> orders = new HashSet<Order>();

	get/set

}
<hibernate-mapping package="com.demo.model.many2one.both">
    <class name="Customer" table="CUSTOMERS">
    
        <id name="id" type="java.lang.Integer">
            <column name="CUSTOMER_ID" />
            <generator class="native" />
        </id>
        
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        
        <!-- 映射一对多集合属性 -->
        <!-- 
        	name:对应的多那端的属性名;
        	table:对应多那端的属性名的持久化类所对应的数据表;
        	inverse:值为true时,表示放弃维护关联关系的权力,即交由另一方管理,默认为false;
        	order-by:可以在查询时对集合中元素进行排序,order-by中使用的是表的字段名,不是持久化类的名称,也可以写入sql函数,
        		如order-by="ORDER_NAME DESC"
         -->
        <set name="orders" table="ORDERS" inverse="true" order-by="ORDER_NAME DESC">
        	<!-- 
        		column:多那端的数据表的外键对应的列的名字;
        		foreign-key:外键的名称
        	 -->
        	<key column="CUSTOMER_ID" foreign-key="FK_CUSTOMER_ID_ORDER_ID"></key>
        	<!-- 指定映射类型,class:映射多那端的持久化类的类型 -->
        	<one-to-many class="Order"/>
        </set>
        
    </class>
</hibernate-mapping>

      这里有几个点需要注意:

      1. 当 Session 从数据库中加载 Java 集合时, 创建的是 Hibernate 内置集合类的实例, 因此在持久化类中定义集合属性时必须把属性声明为 Java 接口类型

      2. 定义集合属性时,通常将其实例化为一个集合实现类的一个实例,这样可以避免访问这个属性时,返回null,发生空指针异常

      测试实例除了关联关系不同,效果基本和单向多对一相同,所以不贴代码了