一、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. AngularJS 笔记1

    2017-03-23 本文更新链接: http://www.cnblogs.com/daysme/p/6606805.html 什么是 angularjs 2009年有两个外国人创建,后由谷歌收购并开 ...

  2. 4、iptables扩展匹配及网络防火墙功能

    关于centos7   firewalld    http://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html 如何保存及重载规则: ...

  3. 理解 Redis(4) - 关于 string 的更多命令(SETEX, SETNX, INCR, DECR, MSET...)

    上一节介绍了关于字符串值的一些基本命令, 这一节将介绍一些进阶命令: 清理终端: 127.0.0.1:6379> clear 设置一个键值对, 同时设置过期时间为10秒: 127.0.0.1:6 ...

  4. 理解 Redis(3) - 字符串值

    正如前面所讲的, redis 的数据结构就是一系列的键值对键 -> printable ASCII (可打印的 ASCII 码, 最大值是 512MB)值 -> Primitives (基 ...

  5. 怎样更新CentOS6.5的yum源

    将yum源设置为国内yum源,可以提升软件包安装和更新的速度,同时避免一些常见软件版本无法找到. 国内源:可以使用wget获取或者直接下载 网易: CentOS5: http://mirrors.16 ...

  6. Python 注释,类,属性,方法,继承

    # coding=utf-8 支持中文 """ 多行注释 声明鸟类 """ class Bird(object): have_feather ...

  7. EF延迟加载和懒加载

    EF默认是延迟加载的 延迟加载就是刚开始只会读取当前实体对应表的数据 关联表的数据不会读取 只有下面条件用到了才会再去读取 所以可能会造成N次读取数据库  需要在实体的属性加virtual关键字 延迟 ...

  8. .NET扩展方法 封装公用方法

    定义方法的时候  第一个参数前面加上this   表示这个方法可以被IQueryable类型的对象.出来  调用的时候 只用传第二个参数  第一个参数不用传 第一个参数就是.出当前方法的参数 定义扩展 ...

  9. 学习笔记38—国外appleID注册教程

    国外appleid注册教程来啦….至于国外appleid有什么用处就不过多的介绍了,需要的人自然是知道,不知道的百度下.1.首先打开苹果appleid注册网址:https://appleid.appl ...

  10. 学习笔记20—MATLAB特殊函数

    1.qfunc就是Q函数 2.mae(平均绝对误差)函数,mae(abs(A-B)) 3.Z = zscore(x) 等价于 Z=(X-repmat(mean(X),57,1))./repmat(st ...