Hibernate详解(四)---->>关联关系映射(一)
关联关系是在领域模型建模中经常使用到的一种关系,它是对现实世界中事物之间的关系最基本的表示。
关联关系指的是不同持久化类之间的一种结构关系,简单的说,关联关系描述某个对象在一段时间内一直知道另一个对象的存在。
关联关系包括多样性的关联和方向性的关联。
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方法...
}
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方法...
}
Department.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.Department" table="department"> <!-- 映射对象标识符 --> <id name="id" column="id" type="long"> <generator class="native" /> </id> <!-- 映射普通属性 --> <property name="name"/> <property name="description"/> </class> </hibernate-mapping>
Employee.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.Employee" table="employee"> <!-- 映射对象标识符 --> <id name="id" column="id" type="long"> <generator class="native" /> </id> <!-- 映射普通属性 --> <property name="username" not-null="true" /> <property name="joinTime" column="join_time" type="timestamp"/> <!-- 用many-to-one元素映射多对一关联 name属性:指定关联的属性名 column属性:指定此关联属性在数据库表中的外键字段名 --> <many-to-one name="dept" column="dept_id"/> </class> </hibernate-mapping>
配置文件: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/Department.hbm.xml" /> <mapping resource="com/zxf/domain/Employee.hbm.xml" /> </session-factory> </hibernate-configuration>
2、单向一对多
举个示例来映射单向一对多关联关系。如:一个账号可以下多个订单。
Order.java(多方 配置文件比较简单)
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方法...
}
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
<?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>