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