三、持久层框架(Hibernate)

一、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.how2java.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_">
        <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.how2java.pojo">
    <class name="Category" table="category_">
        <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.how2java.pojo">
    <class name="User" table="user_">
        <id name="id" column="id">
            <generator class="native">
            </generator>
        </id>
        <property name="name" />

                <!--配置Product与User的多对多关系,中间表是user_product-->
        <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.how2java.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" />
        <!-- 多对多-->
        <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();
    }
}

原文地址:https://www.cnblogs.com/drq1/p/8514736.html

时间: 2024-08-05 21:38:24

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

持久层框架hibernate相关概念

hibernate为全自动的持久层框架(framework): 1.作用:把内存中的活跃对象永远的保存在关系型数据库中. 2.O/R/M原理:O-->object 对象,R---> relational关系型数据库,M--->mapping映射 为了解决应用程序中的对象和关系型数据库中的表的不匹配而提出的一个解决方案. 3.新版本hibernate4中怎么得到session工厂从而创建连接对象 Configuration cfg = new Configuration().configu

持久层框架--hibernate(3)

一:关联关系 1.关联关系的方向可分为单向关联和双向关联 单向关联:假设存在两张表province表和City表,如果在应用的业务逻辑中,仅需要每个province实例能够查询得到其对应的City实例,而City实例并不需要查询得到其对应的province实例:或者反之. 双向关联:既需要每个province实例能够查询得到其对应的City实例,City实例也需要查询得到其对应的province实例. 2.关联的数量,根据拥有被关联对象的个数确定 多对一(many to one):如用户和组 学

持久层框架--hibernate(2)

一 .持久化对象的oid 映射为数据库表的主键,唯一不重复 当数据库表中的主键为代理主键时,持久化对象的oid 要交给hibernate来维护(避免重复) 当数据库中表的主键为自然主键时,持久化对象的oid 要由程序本身来维护 主键生成策略(生成持久化oid的方式): 1. increment 带走+1 由hibernate来维护oid的值, 优点:与底层数据库类型无关 缺点:只适用于单线程对数据库的访问 2. identity +1带走 优点:适合多用户访问 缺点:由于+1操作由数据库完成,所

持久层框架--hibernate(4)

一.多对多双向关联 以Student和Course为例,一个学生可以选多门课程,一门课程也可以被多个学生选取 持久化类Student 1 持久化类Student.java 2 3 package com.edu.many2many; 4 5 import java.util.HashSet; 6 import java.util.Set; 7 8 public class Student { 9 10 private Integer id; 11 private String name; 12

[笔面] Hibernate等持久层框架应用面试

Hibernate等持久层框架应用 1.Hibernate框架的工作流程a. 读取并解析配置文件b.读取并解析映射信息,创建SessionFactoryc.打开Sesssiond.创建事务Transatione.持久化操作f.提交事务g.关闭Sessionh.关闭SesstionFactory 2.Hibernate框架中的核心接口有哪些,这些接口的具体功能是什么?核心接口有:session,sessionFactory,transaction,query,configuration.a) Se

Hibernate数据库持久层框架

Hibernate是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hibernate也是目前Java开发中最为流行的数据库持久层框架,现已归JBOSS所有. 它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来.无论是从设计草案还是从一个遗留数据库开始,开发人员都可以采用Hibernate. Hibernate不仅负责从Java类到数据库表的映射(还

Hibernate: 数据持久层框架

Hibernate 是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hibernate也是目前Java开发中最为流行的数据库持久层框架,现已归JBOSS所有.基于LGPL V2.1协议发布. 它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来.无论是从设计草案还是从一个遗留数据库开始,开发人员都可以采用Hibernate. Hibernate不仅负

MyBatis持久层框架使用总结

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2013年11月迁移到Github,MyBatis的Github地址:https://github.com/mybatis/mybatis-3. iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Dat

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

MyBatis持久层框架使用总结 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2013年11月迁移到Github,MyBatis的Github地址:https://github.com/mybatis/mybatis-3. iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架.iBATIS提供的持久

持久层框架JPA与Mybatis该如何选型

一.现状描述 目前java 持久层ORM框架应用最广泛的就是JPA和Mybatis.JPA只是一个ORM框架的规范, 对该规范的实现比较完整就是Spring Data JPA(底层基于Hibernate实现),是基于Spring的数据持久层框架,也就是说它只能用在Spring环境内.Mybatis也是一个优秀的数据持久层框架,能比较好的支持ORM实体关系映射.动态SQL等. 笔者在学习这两个框架的过程中,看过不少的帖子,每当有帖子比较这两个框架的优缺点,就引来一场论战.从笔者的角度,为什么国内的