笔记45 Hibernate快速入门(二)
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快速入门(二)的更多相关文章
- 笔记47 Hibernate快速入门(四)
Hibernate注解,完成原来xml文件里的映射信息. 使用注解时,要修改hibernate.cfg.xml中的映射,不再是通过xml文件 <mapping class="hiber ...
- 笔记46 Hibernate快速入门(三)
Hibernate相关概念 一.事物概念 Hibernate的任何对数据有改动的操作,都应该被放在事务里面. hibernate中的事务由s.beginTransaction();开始由s.getTr ...
- 笔记44 Hibernate快速入门(一)
一.Hibernate简介 Hibernate 是传统 Java 对象和数据库服务器之间的桥梁,用来处理基于 O/R 映射机制和模式的那些对象. Hibernate 架构是分层的,作为数据访问层,你不 ...
- (转)Hibernate快速入门
http://blog.csdn.net/yerenyuan_pku/article/details/64209343 Hibernate框架介绍 什么是Hibernate 我们可以从度娘上摘抄这样有 ...
- MyBatis学习笔记(一)——MyBatis快速入门
转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4261895.html 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优 ...
- 【Python】【学习笔记】1.快速入门
1.软件安装 从官网下载相应版本的安装包,一般不大. https://www.python.org/ 安装一路默认即可 2. 参考教程:快速入门:十分钟学会Python 本文的内容介于教程(Totur ...
- python3.5+django2.0快速入门(二)
昨天写了python3.5+django2.0快速入门(一)今天将讲解配置数据库,创建模型,还有admin的后台管理. 配置数据库 我们打开mysite/mysite/settings.py这个文件. ...
- 【笔记】PyTorch快速入门:基础部分合集
PyTorch快速入门 Tensors Tensors贯穿PyTorch始终 和多维数组很相似,一个特点是可以硬件加速 Tensors的初始化 有很多方式 直接给值 data = [[1,2],[3, ...
- 笔记51 Mybatis快速入门(二)
Mybatis的CRUD 1.修改配置文件Category.xml,提供CRUD对应的sql语句. <?xml version="1.0" encoding="UT ...
随机推荐
- Javascript高级程序设计--读书笔记之面向对象(二)
前面讲了面向对象的封装,这章我们就来说一说继承 1.原型链 实现原型链有一种基本模式,其代码大概如下 <script> function SuperType(){ this.propert ...
- MYSQL增量备份与恢复
vim /etc/my.cnf在[mysqld]下添加max_binlog_size = 1024000 //二进制日志最大1M 要进行mysql的增量备份,首先要开启二进制日志功能方法一:在/etc ...
- 【JS学习】慕课网4-10 编程练习
在一个大学的编程选修课班里,我们得到了一组参加该班级的学生数据,分别是姓名.性别.年龄和年级,接下来呢,我们要利用JavaScript的知识挑出其中所有是大一的女生的的名字哦. 学生信息如下: ('小 ...
- 为何在新建STM工程中全局声明两个宏
在uVision中新建STM32工程后,需要从STM32标准库中拷贝标准外设驱动到自己的工程目录中,此时需要在工程设置->C/C++选项卡下的Define文本框中键入这两个全局宏定义. STM3 ...
- application/x-www-form-urlencode/multipart/form-data
首先我们先认识下今天的application/x-www-form-urlencode/multipart/form-data属性所在的位置 1.form所属 在Form元素的语法中,EncType表 ...
- Magento用SQL语句开发篇
有时为了调试magento,需要获取当前的查询sql语句,在magento中获取SQL语句,这里我们通过$collection->getSelectSql(true)来调试sql 1 $coll ...
- 【Jenkins、sonar】
1.Jenkins入门(一)安装Jenkins 2.Jenkins入门(二)部署java项目 3.Jenkins远程部署SpringBoot应用 4.配置sonar.jenkins进行持续审查 5.S ...
- php-异步上传插件
http://www.cnblogs.com/kissdodog/archive/2012/12/15/2819025.html
- docker的备份和迁移
备份与迁移 容器保存为镜像 我们可以通过以下命令将容器保存为镜像 docker commit pyg_nginx mynginx pyg_nginx是容器名称 mynginx是新的镜像名称 此镜像的内 ...
- lnmp mysql高负载优化
mysql负载会造成cpu占用高的问题如果没启用innodb的话 用这个配置/usr/local/mysql/share/mysql/my-large.cnf 替换/etc/my.cnf 也可参考如下 ...