1. 程式人生 > >三、持久層框架(Hibernate)

三、持久層框架(Hibernate)

true 技術分享 mysql 分享圖片 pac transacti cat tid localhost

一、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;
View Code

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; } }
View Code

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>
View Code

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;
    }
    
}
View Code

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>
View Code

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>
View Code

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

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;
    }
}
View Code

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>
View Code

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

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;
    }
}
View Code

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>
View Code

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;
    }
}
View Code

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>
View Code

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>
View Code

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

三、持久層框架(Hibernate)