本文讲解Hibernate关联映射的例子,以订单和客户之间的关联关系来说明。我们知道,在一个电商网站中,一个客户可以有多个订单,反过来多个订单可以属于同一个客户。那么在Hibernate中怎样把这里面的关联关系映射好,是下面要阐述的问题。
首先我们要在数据库中创建两张表一个是客户表另一个是订单表。内容如下:
客户表:
这个表包含一个主键id以及用户名称(username)。
订单表:
这个表也有一个主键id,type(商品类型)、ordernumber(商品流水号)、customID(引用客户表主键id的一个外键),其实关联映射就是通过这个外键来实现的。
表创建好后,相当于完成了ORM中的R也就是关系表的创建,现在讲一下O的配置,也即数据库中对应的JAVABEAN(实体类)。
客户的实体类为:
package com.ev.entity.user;
import java.util.HashSet;
import java.util.Set;
public class User {
private Integer id;
private String username;
private Set orderSet = new HashSet();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Set getOrderSet() {
return orderSet;
}
public void setOrderSet(Set orderSet) {
this.orderSet = orderSet;
}
}
在这个实体类中多了一个字段orderSet ,这个就是用来存放每个客户对应的订单,多个订单放在HashSet中,而对这个实体类所做的关联映射操作其实是针对这个属性字段的。它对应的User.hbm.xml映射文件为:
<?xml version="1.0"?>
<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.ev.entity.user.User" table="user">
<id name="id">
<generator class="native" />
</id>
<property name="username"/>
<set name="orderSet">
<key column="customID"></key>
<one-to-many class="com.ev.entity.orders.Orders"></one-to-many>
</set>
</class>
</hibernate-mapping>
class里面的set子元素就是对orderSet属性做了关联映射,one-to-many元素在这里指一个客户可以有多个订单,在这个元素中classs属性值指定了存放于HashSet集合中的数据类型,即订单类型,在这里指向一个订单的实体类,接下来会讲到。key元素中的column属性值引用之前创建的订单中的外键。
接下来是订单的实体类:
package com.ev.entity.orders;
import com.ev.entity.user.User;
public class Orders {
private Integer id;
private String type;
private String ordernumber;
private User user;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getOrdernumber() {
return ordernumber;
}
public void setOrdernumber(String ordernumber) {
this.ordernumber = ordernumber;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
这个实体类同样与数据库中的订单表字段对应,但它也多了一个user属性,这个属性指定该订单属性哪个客户。下面就要对这个属性进行映射。
Orders.hbm.xml内容如下:
<?xml version="1.0"?>
<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.ev.entity.orders.Orders" table="orders">
<id name="id">
<generator class="native" />
</id>
<property name="type"/>
<property name="ordernumber"/>
<many-to-one name="user" class="com.ev.entity.user.User">
<column name="customID"></column>
</many-to-one>
</class>
</hibernate-mapping>
many-to-one元素指多个订单可以归属同个客户,它的name属性值引用订单实体类的user属性,class指定该属性的类型,column 元素的name属性引用订单表外键。
这样客户和订单的实体类就可以做关联映射了。这两个配置文件可以放在对应实体类所在的文件目录下。
最后在hibernate.cfg.xml配置文件中引用下这两个配置文件即可。
hibernate.cfg.xml:
<?xml version='1.0' encoding='utf-8'?>
<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
-->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/usergood</property>
<property name="connection.username">root</property>
<property name="connection.password">******</property>
<mapping resource="com/ev/entity/user/User.hbm.xml"></mapping>
<mapping resource="com/ev/entity/orders/Orders.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
可以使用DAO设计模式实现Model层来处理后台逻辑,具体参考《JAVA中Hibernate基本配置》。