Hibernate 双向 多对一

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate 双向 多对一相关的知识,希望对你有一定的参考价值。

双向多对一和单向多对一唯一不同的地方是多对一的一那端增加了到多那端的映射关联,参照模型还是顾客(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,发生空指针异常

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


本文出自 “11220092” 博客,请务必保留此出处http://11230092.blog.51cto.com/11220092/1753434

以上是关于Hibernate 双向 多对一的主要内容,如果未能解决你的问题,请参考以下文章

hibernate多对多查询

hibernate中配置单向多对一关联,和双向一对多

Hibernate双向多对多关联

hibernate的映射之四(多对多双向关联)

hibernate多对多双向关系映射的级联配置

Hibernate映射多对多双向关联关系(小案例)