Hibernate的关系映射
Hibernate关系映射就是将关系数据库中表的数据映射为java中的对象,以实现对数据的操作。
1.多对一关系映射
本例实现多个Product对应一个Category关系映射
创建Category实体
package pojo;
public class Category {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在同一个包中配置Category.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-5-30 17:48:28 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="pojo.Category" table="CATEGORY">
<id name="id" type="int">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
</class>
</hibernate-mapping>
在Product类增加Category属性
private Category category;
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
在Product.hbm.xml设置对Category的多对一映射
<many-to-one name="category" class="pojo.Category" column="cid"></many-to-one>
column="cid"表示指向Category表的外键
在hibernate.cfg.xml中添加Category的映射
<mapping resource="pojo/Category.hbm.xml" />
在主类中测试many-to-one关系
// 多对一关系映射
Category category1 = new Category();
category1.setName("c1");
session.save(category1);
Product product5 = (Product) session.get(Product.class, 0);
product5.setCategory(category1);
session.update(product5);
2.一对多关系映射
本例实现一个Category对应多个Product关系映射
为Category类增加一个Set集合
private Set<Product> products;
public Set<Product> getProducts() {
return products;
}
public void setProducts(Set<Product> products) {
this.products = products;
}
在Category.hbm.xml增加one-to-many映射
<set name="products" lazy="false">
<key><column name="cid" not-null="false"></column></key>
<one-to-many class="pojo.Product"/>
</set>
lazy="false"表示不使用延迟加载,关于延迟加载后面章节会讲解
在主类中测试one-to-many关系
// 一对多关系映射
Category category2 = (Category) session.get(Category.class, 0);
Set<Product> products2 = category2.getProducts();
for (Product product : products2) {
System.out.println(product.getName());
}
3.多对多关系映射
本例实现多个Product对应多个User关系映射
要实现多对多关系映射,需要一张中间表,在本例中为user_product
创建User实体
package pojo;
import java.util.Set;
public class User {
private int id;
private String name;
private Set<Product> products;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Product> getProducts() {
return products;
}
public void setProducts(Set<Product> products) {
this.products = products;
}
}
在同一个包中配置User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-5-30 18:34:31 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="pojo.User" table="USER">
<id name="id" type="int">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<set name="products" table="USER_PRODUCT" inverse="false" lazy="false">
<key>
<column name="UID" />
</key>
<many-to-many class="pojo.Product" column="pid"/>
</set>
</class>
</hibernate-mapping>
在Product类增加对应User的集合
private Set<User> users;
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
在Product.hbm.xml增加many-to-many映射
<set name="users" table="user_product" lazy="false">
<key column="pid" />
<many-to-many column="uid" class="pojo.User" />
</set>
在hibernate.cfg.xml中添加User的映射
<mapping resource="pojo/User.hbm.xml" />
在主类中测试many-to-many关系
// 多对多关系映射
Set<User> users = new HashSet<User>();
for (int i = 0; i < 3; i++) {
User user = new User();
user.setName("user" + i);
users.add(user);
session.save(user);
}