Gbug00 2011-05-02
关联关系是在领域模型建模中经常使用到的一种关系,它是对现实世界中事物之间的关系最基本的表示。
关联关系指的是不同持久化类之间的一种结构关系,简单的说,关联关系描述某个对象在一段时间内一直知道另一个对象的存在。
关联关系包括多样性的关联和方向性的关联。
Hibernate 框架作为一种 ORM 技术的实现,对关联关系的映射实现得很完美,也易于理解和掌握,接下来分别介绍各类型关联关系的映射在 Hibernate 中是如何实现的。1、单向多对一 多对一是最常见的,也是最容易理解的一种关联。比如:多个员工属性同一个部门。多个产品属于同一个类别,多个产品订单属于同一个账号。单向的多对一指的是多方可以访问一方,而一方不知道多方的存在。
Department.java(一方)
package com.zxf.domain; /** 部门实体类 */ public class Department { private Long id; //对象标识符(OID) private String name; //姓名 private String description; //入职时间 public Department(){} //无参数的构造方法 //以下省略所有属性的getters和setters方法... }
package com.zxf.domain; /** 部门实体类 */ public class Department { private Long id; //对象标识符(OID) private String name; //姓名 private String description; //入职时间 public Department(){} //无参数的构造方法 //以下省略所有属性的getters和setters方法... }
Employee.java(多方)
package com.qiujy.domain; import java.util.Date; /** 员工实体类 */ public class Employee { private Long id; //对象标识符(OID) private String username; //姓名 private Date joinTime; //入职时间 private Department dept; //所属的部门 public Employee(){} //无参数的构造方法 //以下省略所有属性的getters和setters方法... }
package com.qiujy.domain; import java.util.Date; /** 员工实体类 */ public class Employee { private Long id; //对象标识符(OID) private String username; //姓名 private Date joinTime; //入职时间 private Department dept; //所属的部门 public Employee(){} //无参数的构造方法 //以下省略所有属性的getters和setters方法... }
Department.hbm.xml
package com.zxf.domain; import java.util.Date; /** 订单实体类 */ public class Order { private Long id; //对象标识符(OID) private String orderNo; //订单编号 private Date createdTime; //下单时间 public Order(){} //无参数的构造方法 //以下省略所有属性的getters和setters方法... }
package com.zxf.domain; import java.util.Date; /** 订单实体类 */ public class Order { private Long id; //对象标识符(OID) private String orderNo; //订单编号 private Date createdTime; //下单时间 public Order(){} //无参数的构造方法 //以下省略所有属性的getters和setters方法... }
Account.java(一方 配置文件相对复杂)
package com.zxf.domain; import java.util.Set; /** 账号实体类 */ public class Account { private Long id; //对象标识符(OID) private String loginName; //姓名 private Set<Order> orderSet; //所下订单的集合 public Account(){} //无参数的构造方法 //以下省略所有属性的getters和setters方法... }
package com.zxf.domain; import java.util.Set; /** 账号实体类 */ public class Account { private Long id; //对象标识符(OID) private String loginName; //姓名 private Set<Order> orderSet; //所下订单的集合 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"/> </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"/> <!-- 映射集合属性,关联到多端的实体类 --> <set name="orderSet" cascade="save-update"> <!-- 用key元素指定关联的外键列 --> <key column="account_id" /> <!-- 用one-to-many元素关联到多端的实体类 --> <one-to-many class="com.zxf.domain.Order" /> </set> </class> </hibernate-mapping>
配置文件:hibernate.cfg.xml