一、Hibernate处理关系

关系主要有三种:1、多对一  2、一对多  3、多对多

1、多对一

一个Product对应一个Category,一个Category对应多个Product(一个产品对应一个类别,一个类别对应多个产品)

也就是Product和Category是多对一的关系。(多个产品对应一个类别)

1.1在数据test下创建表category_table,两个字段,id(自增),字符串格式name

其实也不用建表,因为Hibernate会自动建表。

use test;
 
CREATE TABLE category_ table(
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(30) ,
  PRIMARY KEY (id)
) DEFAULT CHARSET=UTF8;

1.2、准备类别实体类(Category.java)

package com.demo.pojo
public class Category{
private int id;//类别id
private String name;//类别名称 //属性的getter/setter方法
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;
}
}

1.3、准备类别实体类的映射xml(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="com.demo.pojo">
<class name="Category" table="category_table">
<id name="id" column="id">
<generator class="native">
</generator>
</id>
<property name="name" />
</class> </hibernate-mapping>

1.4、为产品实体类(Product.java)增加Category属性

package com.how2java.pojo;
public class Product {
int id;
String name;
float price;
//增加Category的属性
Category category;
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
} 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 float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
} }

1.5、为产品映射xml文件(Product.hbm.xml)设置Category多对一关系

<many-to-one name="category" class="Category" column="cid" />

使用many-to-one标签设置多对一关系,name="category",对应Product类中的category属性

class="Category"表示对应Category类,column="cid"表示指向category_table的外键。

具体配置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="com.how2java.pojo">
<class name="Product" table="product_table">
<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" />
</class> </hibernate-mapping>

1.6、在hibernate.cfg.xml中增加Category的映射文件

<?xml version='1.0' encoding='utf-8'?>
<!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/test?characterEncoding=GBK</property>
<property name="connection.username">root</property>
<property name="connection.password">admin</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<!--Product实体类的映射文件-->
<mapping resource="com/demo/pojo/Product.hbm.xml" />
<!--Category实体类的映射文件-->
<mapping resource="com/demo/pojo/Category.hbm.xml" />
</session-factory> </hibernate-configuration>

1.7测试many-to-one多对一关系

package com.demo.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import com.demo.pojo.Product;
public class TestHibernate{
public static void main(String[] args){
SessionFactory sf=new Configuration().configure().buildSessionFactory();
Session session=sf.opneSession();
session.beginTransaction(); Category category=new Category();
category.setName("car");
session.save(category); Product product=(Product)s.get(Product.clas,5);//获取id=5的产品
product.setCategory(category);//把类别设置到产品的实体类中
session.update(p); session.getTransaction().commint();
session.close();
sf.close();
}
}

2、一对多

Category和Product是一对多关系(一个Category对应多个Product)

2.1、给Category实体类增加一个Set集合(无序的Product)

package com.demo.pojo
import java.util.Set;
public class Category{
private int id;//类别id
private String name;//类别名称 //属性的getter/setter方法
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;
} //设置Product的Set
Set<Product> products;
public Set<Product> getProducts(){
return products;
}
public void SetProducts(Set<Product> products){
this.products=products;
}
}

2.2、给Category.hbm.xml增加one-to-many映射

<set name="products" lazy="false">
<key column="cid" not-null="false"/>
<ont-to-many class="Product"/>
</set>

set标签用于设置一对多关系,也可以设置多对多。

name="products"对应Category类中的products属性,lazy="false",表示不使用延迟加载

<key colum="cid" not-null="false"/>表示外键是cid,可以为空

<one-to-many class="Product"/>表示一对多对应的类是Product

<?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="com.demo.pojo">
<class name="Category" table="category_table">
<id name="id" column="id">
<generator class="native">
</generator>
</id>
<property name="name" /> <!--set标签设置一对多关系-->
<set name="products" lazy="false">
<key column="cid" not-null="false" />
<one-to-many class="Product" />
</set>
</class>
</hibernate-mapping>

2.3、测试one-to-many关系

  首先获取id=i的category,然后通过getProducts()获取所对应的所有的product

package com.demo.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import com.demo.pojo.Product;
public class TestHibernate{
public static void main(String[] args){
SessionFactory sf=new Configuration().configure().buildSessionFactory();
Session session=sf.opneSession();
session.beginTransaction(); Category category=new Category();
category.setName("car");
session.save(category); Category category=(Category)session.get(Category.class,1);//获取id=1的类别
Set<Product> set=c.getProducts();//获取产品的集合
for(Product p:set){//遍历产品集合
System.out.println(p.getName());
}
session.getTransaction().commint();
session.close();
sf.close();
}
}

3、多对多

一种product可以被多个User购买,一个User可以购买多种Product

所以Product和User之间关系是多对多many-to-many

要实现多对多关系,必须要有一张中间表,user_product用于维护User和Product之间的关系

3.1、User的实体类(User.java)

  增加Product集合

package com.demo.pojo;
import java.util.Set;
public class User{
private int id;//用户id
private String name;//用户名
Set<Product> products;//产品 //属性的getter/setter方法
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public int getName(){
return name;
}
public void setName(String name){
this.name=name;
}
//设置Product的Set
public Set<Product> getProducts(){
return products;
}
public void setProducts(Set<Product> products){
this.products=products;
}
}

3.2、User.hbm.xml映射文件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="com.demo.pojo">
<class name="User" table="user_table">
<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.3、Product的实体类(Product.java)

  增加User的集合

package com.demo.pojo;
import java.util.Set;
public class Product{
private int id;
private String name;
private float price; Category category;//一对多 Set<User> users;//多对多 //属性的getter/setter方法
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 float getPrice(){
return price;
}
public void setPrice(float price){
this.price=price;
} //Category
public Category getCategory(){
return category;
}
public void setCategory(Category category){
this.category=category;
}
//Set<User>
public Set<User> getUser(){
return users;
}
public vodi setUser(Set<User> users){
this.users=users;
}
}

3.4、Product的映射文件配置(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="com.demo.pojo">
<class name="Product" table="product_table">
<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" />
<!-- 多对多-->
<set name="users" table="user_product" lazy="false">
<key column="pid" />
<many-to-many column="uid" class="User" />
</set>
</class>
</hibernate-mapping>

3.5、在hibernate.cfg.xml中增加User.hbm.xml的映射

<?xml version='1.0' encoding='utf-8'?>
<!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/test?characterEncoding=GBK</property>
<property name="connection.username">root</property>
<property name="connection.password">admin</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<!--映射文件的配置-->
<mapping resource="com/demo/pojo/Product.hbm.xml" />
<mapping resource="com/demo/pojo/Category.hbm.xml" />
<mapping resource="com/demo/pojo/User.hbm.xml" />
</session-factory> </hibernate-configuration>

3.6、测试多对多many-to-many关系

package com.demo.test;

import java.util.HashSet;
import java.util.Set; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import com.demo.pojo.Product;
import com.demo.pojo.User; public class TestHibernate{
public static void main(String[] args){
SessionFactory sf=new Configuration().configure().buildSessionFactory();
Session session=sf.opneSession();
session.beginTransaction();
//增加3个用户
Set<User> users=new HashSet();
for(int i=0;i<3;i++){
User u=new User();
u.setName("user"+i);
users.add(u);
s.save(u);
}
//id=1产品被用户1,2,3购买
Product product=(Product)session.get(Product.class,1);
product.setUsers(users);
s.save(product); session.getTransaction().commint();
session.close();
sf.close();
}
}

三、持久层框架(Hibernate)的更多相关文章

  1. 菜鸟学习Hibernate——持久层框架

    一.Java操作数据库的阶段. Java对数据库进行操作经历了三个阶段. 1.1操作JDBC阶段 这个阶段就是利用JDBC类来操作数据库.这个阶段出现了两个问题: 代码过度重复:在每一次数据库操作的是 ...

  2. Hibernate数据库持久层框架

    Hibernate是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hib ...

  3. Java数据持久层框架 MyBatis之背景知识三

    摘录自:http://www.cnblogs.com/lcngu/p/5437281.html 对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.or ...

  4. Hibernate: 数据持久层框架

    Hibernate 是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hi ...

  5. Mybatis学习之自定义持久层框架(三) 自定义持久层框架:读取并解析配置文件

    前言 前两篇文章分别讲解了JDBC和Mybatis的基本知识,以及自定义持久层框架的设计思路,从这篇文章开始,我们正式来实现一个持久层框架. 新建一个项目 首先我们新建一个maven项目,将其命名为I ...

  6. MyBatis持久层框架使用总结

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2 ...

  7. .NET平台下,关于数据持久层框架

    在.NET平台下,关于数据持久层框架非常多,本文主要对如下几种做简要的介绍并推荐一些学习的资源: 1.NHibernate 2.NBear 3.Castle ActiveRecord 4.iBATIS ...

  8. 持久层框架之MyBatis

    1.mybatis框架介绍: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ...

  9. MyBatis持久层框架学习之01 MyBatis的起源和发展

    一.MyBatis的简介  MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.    MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyB ...

  10. MyBatis持久层框架使用总结 转载

    MyBatis持久层框架使用总结   MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google co ...

随机推荐

  1. Leetcode122-Best Time to Buy and Sell Stock II-Easy

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  2. SAP月末结账年结流程

    SAP月末结账年结流程 SAP月末结账操作指南 流程描述:FI期末结帐流程包括应收帐款.应付帐款.固定资产.管理会计结帐.总帐结帐等一系列结帐过程,对于年结增加了余额结转及固定资产年度改变等动作,通过 ...

  3. Jquery 点击事件重复获取叠加 (一)

    用jquery添加绑定事件 添加多少次 点击的时候就触发多少次 如果想解决这个问题 就在点击函数里先用 $(对象).off("click") 取消上一次的点击事件 上码: $(&q ...

  4. Centos7下安装memcached

    1. which memcached //如果已经安装,会有“/usr/bin/memcached”类似的输出 memcached -h //memcache帮助列表 php -m | grep me ...

  5. 对前台传过来的实体是否为空 进行为空校验的N种方法

    首先定义一个注解,如下 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import j ...

  6. MySQL学习(九)

    1 一道面试题 新建两张表 mysql> create table m -> ( -> mid int, -> hid int, -> gid int, -> mr ...

  7. Python pip 常用命令

    使用了这么就pip命令,但是一直是简单使用,很多命令都是用了查,查了用,今天把常用的命令汇总一下,方便使用. 命令: pip 由上图可以看到 pip 支持一下命令 Commands: install ...

  8. html5实现获取地理位置信息并定位

    这里主要讲h5实现获取地理位置信息并定位功能,本文讲解了原生h5,百度地图,谷歌地图等三种获取地理信息并定位的方法,需要的朋友可以参考下: h5提供了地理位置功能(Geolocation API),能 ...

  9. 第 3 章 镜像 - 020 - 搭建本地 Registry

    Docker Hub 虽然非常方便,但还是有些限制,比如: 需要 internet 连接,而且下载和上传速度慢. 上传到 Docker Hub 的镜像任何人都能够访问,虽然可以用私有 reposito ...

  10. legend2---开发日志7(vue的使用场景有哪些,或者说使用的优缺点)

    legend2---开发日志7(vue的使用场景有哪些,或者说使用的优缺点) 一.总结 一句话总结:任何页面都可以使用vue,尤其是有交互的或者用ajax的,但是vue插件及其它各种插件加载需要时间, ...