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>