Hibernate O/R 映射

一、多对一

  一个Product对应一个Category,一个Category对应多个Product,所以Product和Category是多对一的关系。使用hibernate实现多对一。

1.准备Category类

 package hibernate.pojo;

 import java.util.Set;

 public class Category {
int id;
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;
} }

2.准备Category.hbm.xml

 <?xml version="1.0"?>

 <!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="hibernate.pojo">
<class name="Category" table="category">
<!-- <cache usage="read-only"/> -->
<id name="id" column="id">
<generator class="native">
</generator>
</id>
<property name="name" />
</class>
</hibernate-mapping>

3.为Product.java增加Category属性

     Category category;
public Category getCategory() {
return category;
} public void setCategory(Category category) {
this.category = category;
}

4.在Product.hbm.xml中设置Category多对一关系

 <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate.pojo">
<class name="Product" table="product">
<id name="id" column="id">
<generator class="native">
</generator>
</id>
<property name="name" />
<property name="price" />
<many-to-one name="category" class="Category" column="cid"></many-to-one>
</class> </hibernate-mapping>

使用many-to-one 标签设置多对一关系
name="category" 对应Product类中的category属性
class="Category" 表示对应Category类
column="cid" 表示指向 category_表的外键

5.在hibernate.cfg.xml中增加Category的映射

 <mapping resource="hibernate/pojo/Category.hbm.xml" />

6.测试

  在这个测试例子中,增加了五个新的Category对象,然后对商品进行随机分类。

 package hibernate.test;

 import java.util.List;
import java.util.Random; import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import hibernate.pojo.Category;
import hibernate.pojo.Product; public class testManyToOne { public static void main(String[] args) {
// TODO Auto-generated method stub SessionFactory sFactory = new Configuration().configure().buildSessionFactory();
Session session = sFactory.openSession();
session.beginTransaction(); for (int i = 1; i <= 5; i++) {
Category category = new Category();
category.setName("C" + i);
session.save(category);
} Query query2 = session.createQuery("from Category");
List<Category> categorys = query2.list(); for (int i = 1; i <= 10; i++) {
Random random = new Random();
Product product = (Product) session.get(Product.class, i);
product.setCategory(categorys.get(random.nextInt(5)));
session.update(product);
} session.getTransaction().commit();
session.close();
sFactory.close();
} }

二、一对多

  一个Product对应一个Category,一个Category对应多个Product,所以Category和Product是一对多的关系。

1.为Category增加一个Set集合

 package hibernate.pojo;

 import java.util.Set;

 public class Category {
int id;
String name;
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;
} }

2.为Category.hbm.xml增加one-to-many映射

 <?xml version="1.0"?>

 <!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="hibernate.pojo">
<class name="Category" table="category">
<!-- <cache usage="read-only"/> -->
<id name="id" column="id">
<generator class="native">
</generator>
</id>
<property name="name" />
<set name="products" lazy="true">
<key column="cid" not-null="false"></key>
<one-to-many class="Product" />
</set>
</class> </hibernate-mapping>

3.测试

 package hibernate.test;

 import java.util.List;

 import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import hibernate.pojo.Category;
import hibernate.pojo.Product; public class testOneToMany { public static void main(String[] args) {
// TODO Auto-generated method stub SessionFactory sFactory = new Configuration().configure().buildSessionFactory();
Session session = sFactory.openSession();
session.beginTransaction(); Query query = session.createQuery("from Category");
List<Category> categories = query.list();
for (Category c : categories) {
System.out.println("属于" + c.getName() + "类的商品有:");
for (Product p : c.getProducts()) {
System.out.println(p.getName());
}
} session.getTransaction().commit();
session.close();
sFactory.close();
} }

三、多对多

  一种Product可以被多个User购买 一个User可以购买多种Product 所以Product和User之间的关系是多对多 many-to-many 要实现多对多关系,必须有一张中间表 user_product 用于维护 User和Product之间的关系。

1.User.java

 package hibernate.pojo;

 import java.util.Set;

 public class User {
int id;
String name;
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;
} }

2.User.hbm.xml

 <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate.pojo">
<class name="User" table="user">
<id name="id" column="id">
<generator class="native">
</generator>
</id>
<property name="name" /> <set name="products" table="user_product" lazy="false">
<key column="uid" />
<many-to-many column="pid" class="Product" />
</set> </class> </hibernate-mapping>

3.Product.java

     Set<User> users;
public Set<User> getUsers() {
return users;
} public void setUsers(Set<User> users) {
this.users = users;
}

4.Product.hbm.xml

 <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate.pojo">
<class name="Product" table="product">
<id name="id" column="id">
<generator class="native">
</generator>
</id>
<!--version元素必须紧挨着id后面 -->
<version name="version" column="ver" type="int"></version>
<property name="name" />
<property name="price" />
<many-to-one name="category" class="Category" column="cid"></many-to-one>
<set name="users" table="user_product" lazy="false" >
<key column="pid"></key>
<many-to-many column="uid" class="User"></many-to-many>
</set>
</class> </hibernate-mapping>

5.在hibernate中增加User的映射

 <mapping resource="hibernate/pojo/User.hbm.xml" />

6.测试

首先添加三个用户,然后实现一件商品多人购买和一个人购买多件商品(再新增用户“user3”)两个功能。

 package hibernate.test;

 import java.util.HashSet;
import java.util.List;
import java.util.Set; import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import hibernate.pojo.Product;
import hibernate.pojo.User; public class testManyToMany { public static void main(String[] args) {
// TODO Auto-generated method stub SessionFactory sFactory = new Configuration().configure().buildSessionFactory();
Session session = sFactory.openSession();
session.beginTransaction();
// 添加三个用户
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);
}
// 一件商品多个人购买
Product p1 = (Product) session.get(Product.class, 2);
p1.setUsers(users);
session.save(p1); // 一个人购买多个商品
// 获取商品列表 User user = new User();
user.setName("user3");
session.save(user); Query query = session.createQuery("from Product");
List<Product> products = query.list();
Set<Product> products2 = new HashSet<Product>();
for (int i = 0; i < products.size(); i++) {
products2.add(products.get(i));
}
User u1 = (User) session.get(User.class, 4);
u1.setProducts(products2);
session.save(u1); session.getTransaction().commit();
session.close();
sFactory.close();
} }

最新文章

  1. 使用rem缩放网页的javascript代码
  2. windows 如何查看端口占用情况?
  3. java简单的数据库查询(SQLServer数据库)
  4. 【HTTP】POST 与 PUT 方法区别
  5. excel跨表数据链接
  6. c#如何在win7下设置IE代理的完美解决方案
  7. [反汇编练习] 160个CrackMe之010
  8. android学习日记09--BitMap操作
  9. 开源网站管理工具—Altman
  10. SimHash算法
  11. Android存储小结
  12. 从数据库中,绑定JQuery Accordion控件---Repeater control
  13. POJ1613 147/思维题
  14. C++数据个数未知情况下的输入方法
  15. 13_Android的生命周期
  16. LOJ子序列
  17. Linux进程管理专题
  18. python:unittest之discover()方法批量执行用例
  19. Knockout.js快速学习笔记
  20. 002.HAProxy安装及常见配置

热门文章

  1. Activity 通知
  2. segment fault 定位 与 远程 gdb
  3. linux,进行批量下载文件操作
  4. PHP学习(MVC架构与面向对象)
  5. (转)websocket
  6. zip mysql安装启动方式
  7. 关于ACL访问控制的一些问题:AntiACL
  8. (2)centos7 图形界面
  9. 20、formAdd,javascript实现动态添加
  10. Invoking destroy method &#39;close&#39; on bean with name &#39;dataSource&#39;