Hibernate详解(四)---->>关联关系映射(三)

xiongdy 2011-05-02

Hibernate详解(四)---->>关联关系映射(三)

     下面紧接着Hibernate详解(四)---->>关联关系映射(二)来说。

     

     5、双向一对多(双向多对一)

    对于一对多关联,Hibernate 推荐使用双向管理且多端来维护关联关系。双向的一对多和多对一是完全相同的两种情况,两端都需要增加对关联属性的引用,一端增加集合属性来引用关联的对象,多端增加关联类属性来直接引用关联的对象。

    

     以账号和订单之间的关系为例来映射双向一对多关联。

  Order.java

 

package com.zxf.domain;

import java.util.Date;

/** 订单实体类 */
public class Order {
	private Long id;                //对象标识符(OID)
	private String orderNo;         //订单编号
	private Date createdTime;       //下单时间
	private Account account;        //所属的订单

	public Order(){}             //无参数的构造方法

	//以下省略所有属性的getters和setters方法...
}

     Account.java

package com.zxf.domain;

import java.util.List;


/** 账号实体类 */
public class Account {
	private Long id;                //对象标识符(OID)
	private String loginName;       //姓名
	private List<Order> orderList;  //所下订单的集合
	
	public Account(){}              //无参数的构造方法

	//以下省略所有属性的getters和setters方法...
}

 

  Order.hbm.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
  <!-- 映射持久化类 -->
	<class name="com.zxf.domain.Order" table="orders">
		<!-- 映射对象标识符 -->
		<id name="id" column="id" type="long">
			<generator class="native" />
		</id>
		<!-- 映射普通属性 -->
		<property name="orderNo" column="order_no"/>
		<property name="createdTime" 
		          column="created_time" type="timestamp"/>
		<!-- 订单到账号的多对一关联映射 -->
		<many-to-one name="account" column="account_id" not-null="true"/>     
	</class>
</hibernate-mapping>

 

  Account.hbm.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
  <!-- 映射持久化类 -->
	<class name="com.zxf.domain.Account" table="account">
		<!-- 映射对象标识符 -->
		<id name="id" column="id" type="long">
			<generator class="native" />
		</id>
		<!-- 映射普通属性 -->
		<property name="loginName" column="login_name"/>
		
		<!-- 映射集合属性,关联到多端的实体类 
		     inverse属性:true表示把关联关系的维护权反转给被关联端
		-->
		<bag name="orderList" 
				 cascade="all"
				 inverse="true">
				<!-- 用key元素指定关联的外键列 -->
	        <key column="account_id" />
	        <!-- 用one-to-many元素关联到多端的实体类 -->
	        <one-to-many class="com.zxf.domain.Order" />
	    </bag>
	</class>
</hibernate-mapping>

 

备注:

      在这个映射文件中,使用bag 元素来映射java.util.List,表示使用允许重复元素的无序集合,其中“inverse=true” 表示把Account 类到Order 类的一对多关联关系的维护权交给Order 类,这样,这个双向一对多关联关系的主控方就是Order类。

   配置文件:hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		
		<!-- 数据库方言设置 -->
		<property name="hibernate.dialect">
			org.hibernate.dialect.MySQLInnoDBDialect
		</property>
		
		<!-- 数据库连接参数设置 -->
		<property name="hibernate.connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">123</property>
	
		<!--实际操作数据库时是否显示SQL -->
		<!-- 
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		-->
		
		<!--将数据库schema的DDL导出到数据库 -->
		<property name="hibernate.hbm2ddl.auto">update</property>

		<!-- 以下定义实体类与数据库表的映像文件 -->
		<mapping resource="com/zxf/domain/Account.hbm.xml" />
		<mapping resource="com/zxf/domain/Order.hbm.xml" />
	</session-factory>
</hibernate-configuration>

相关推荐