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();
} }

笔记45 Hibernate快速入门(二)的更多相关文章

  1. 笔记47 Hibernate快速入门(四)

    Hibernate注解,完成原来xml文件里的映射信息. 使用注解时,要修改hibernate.cfg.xml中的映射,不再是通过xml文件 <mapping class="hiber ...

  2. 笔记46 Hibernate快速入门(三)

    Hibernate相关概念 一.事物概念 Hibernate的任何对数据有改动的操作,都应该被放在事务里面. hibernate中的事务由s.beginTransaction();开始由s.getTr ...

  3. 笔记44 Hibernate快速入门(一)

    一.Hibernate简介 Hibernate 是传统 Java 对象和数据库服务器之间的桥梁,用来处理基于 O/R 映射机制和模式的那些对象. Hibernate 架构是分层的,作为数据访问层,你不 ...

  4. (转)Hibernate快速入门

    http://blog.csdn.net/yerenyuan_pku/article/details/64209343 Hibernate框架介绍 什么是Hibernate 我们可以从度娘上摘抄这样有 ...

  5. MyBatis学习笔记(一)——MyBatis快速入门

    转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4261895.html 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优 ...

  6. 【Python】【学习笔记】1.快速入门

    1.软件安装 从官网下载相应版本的安装包,一般不大. https://www.python.org/ 安装一路默认即可 2. 参考教程:快速入门:十分钟学会Python 本文的内容介于教程(Totur ...

  7. python3.5+django2.0快速入门(二)

    昨天写了python3.5+django2.0快速入门(一)今天将讲解配置数据库,创建模型,还有admin的后台管理. 配置数据库 我们打开mysite/mysite/settings.py这个文件. ...

  8. 【笔记】PyTorch快速入门:基础部分合集

    PyTorch快速入门 Tensors Tensors贯穿PyTorch始终 和多维数组很相似,一个特点是可以硬件加速 Tensors的初始化 有很多方式 直接给值 data = [[1,2],[3, ...

  9. 笔记51 Mybatis快速入门(二)

    Mybatis的CRUD 1.修改配置文件Category.xml,提供CRUD对应的sql语句. <?xml version="1.0" encoding="UT ...

随机推荐

  1. js保留两位小数的方法

    js保留两位小数的方法如下 1.toFixed()方法 需注意,保留两位小数,将数值类型的数据改变成了字符串类型 2.Math.floor(),不四舍五入 ,向下取整 注意,不改变数据类型 3.字符串 ...

  2. JavaScript 中 reduce去重方法

    过去有很长一段时间,我一直很难理解 reduce() 这个方法的具体用法,平时也很少用到它.事实上,如果你能真正了解它的话,其实在很多地方我们都可以用得上,那么今天我们就来简单聊聊 JS 中 redu ...

  3. 正规式α向有限自动机M的转换

    [注:这一节是在学习东南大学廖力老师的公开课时,所记录的一些知识点截屏,谢谢廖力老师的辛劳付出] 引入3条正规式分裂规则来分裂α,所得到的是NFA  M(因为包含ε弧,之后进行确定化就是所需要求得DF ...

  4. go声明和初始化

    go声明和初始化 当我们第一次看见变量和声明时,我们仅仅看见一些内置的类型,比如整型和字符串.现在我们将学习结构体,并且我们会深入学习包括指针的内容. 通过一种最简单的方式去创建一个结构体值类型: g ...

  5. 如何基于 Nacos 和 Sentinel ,实现灰度路由和流量防护一体化

    基于Alibaba Nacos和Sentinel,实现灰度路由和流量防护一体化的解决方案,发布在最新的 Nepxion Discovery 5.4.0 版,具体参考: 源码主页,请访问 源码主页指南主 ...

  6. Http请求工具类 httputil

    package com.snowfigure.kits.net; import java.io.BufferedReader; import java.io.IOException; import j ...

  7. luoguP1288 取数游戏II [博弈论]

    题目描述 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流 ...

  8. Windows系统文件夹共享与隐藏共享

    Windows用户之间建立共享文件夹提供共享服务 建立共享文件夹 Window共享:本地网络-->属性-->共享-->高级共享   设置共享名-->另一台主机输入共享主机的IP ...

  9. Delphi GDI+ 安装方法

    [转]Delphi GDI+ 安装方法转自:万一博客(http://www.cnblogs.com/del/)GDI+ 是 Windows 的一个函数库, 来自 Windows\System32\GD ...

  10. AcWing 202. 最幸运的数字 (欧拉定理)打卡

    8是中国的幸运数字,如果一个数字的每一位都由8构成则该数字被称作是幸运数字. 现在给定一个正整数L,请问至少多少个8连在一起组成的正整数(即最小幸运数字)是L的倍数. 输入格式 输入包含多组测试用例. ...