Hibernate4.2.4入門(二)——一對多的映射關係

1、前言

前面咱們已經學過hibernate的基礎,學會增刪改查簡單的操做,然而咱們數據庫中存在着1對多,多對1,多對多的關係,hibernate又是基於ORM基礎上的開源框架,能夠讓咱們不用去編寫SQL語句,它會自動生成,mybatis也是基於ORM基礎上的開源框架,只不過須要咱們編寫sql語句,算是一個半自動的orm吧,今天講解的主要是1對多的映射關係。java

1.一、建立項目mysql

這裏使用到的是組和用戶的關係,1個組能夠有多個用戶。Group和User(這裏筆者說個題外話,注意注意:映射文件中table的名字必定不能是mysql的關鍵字,筆者就是使用了Group,一直報sql語法錯誤,後來才發現原來Group是關鍵字sql

新建實體類:User.java數據庫

package com.hibernate.one_manys;

public class User {
    private int uid;
    private String uname;
    public int getUid() {
        return uid;
    }
    public void setUid(int uid) {
        this.uid = uid;
    }
    public String getUname() {
        return uname;
    }
    public void setUname(String uname) {
        this.uname = uname;
    }
    public User(String uname)
    {
        this.uname=uname;
    }
}
User

新建實體類:Group.java,其中添加User的集合,表示一個組中存在多個用戶,使用集合表示session

package com.hibernate.one_manys;

import java.util.HashSet;
import java.util.Set;

public class Group {
    private int gid;
    private String gtitle;
    private Set<User> users = new HashSet<User>();
    public Set<User> getUsers() {
        return users;
    }
    public void setUsers(Set<User> users) {
        this.users = users;
    }
    public int getGid() {
        return gid;
    }
    public void setGid(int gid) {
        this.gid = gid;
    }
    public String getGtitle() {
        return gtitle;
    }
    public void setGtitle(String gtitle) {
        this.gtitle = gtitle;
    }
}
Group

新建User的配置文件:User.hbm.xmlmybatis

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.hibernate.one_manys.User" table="USER">
        <id name="uid" type="int">
            <column name="UID"></column>
            <generator class="native"></generator>
        </id>
        <property name="uname" column="UNAME"></property>
    </class>
</hibernate-mapping>

新建Group的配置文件:Group.hbm.xmlapp

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- 注意點:Group是mysql中的關鍵字,若是使用會報語句錯誤 -->
    <!-- native:根據底層數據庫的能力選擇identity, sequence 或者hilo中的一個。 -->
    <class name="com.hibernate.one_manys.Group" table="Groups">
        <id name="gid" type="int">
            <column name="GID"/>
            <generator class="native"/>
        </id>
        <property name="gtitle" type="java.lang.String">
            <column name="GTITLE"/>
        </property>
        <!-- cascade:級聯操做
            all : 全部狀況下均進行關聯操做。
            none:全部狀況下均不進行關聯操做。這是默認值。
            save-update:在執行save/update/saveOrUpdate時進行關聯操做。
            delete:在執行delete時進行關聯操做
         -->
        <set name="users" table="User" cascade="delete">
        <!-- column:指明瞭在User表裏有一個gid的列名,是指向Group表的外鍵   -->
            <key column="gid"/>
            <!-- 一對多的映射 -->
            <one-to-many class="com.hibernate.one_manys.User"/>
        </set>
    </class>
</hibernate-mapping>

注意:這裏使用到cascade級聯操做,顧名思義,就是你執行增刪改查的時候會觸發另外一張表,簡單說來就是,當你主表執行刪除時,從表也會隨之刪除。框架

接下來編寫測試類:ide

package com.hibernate.one_manys;


import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

/**
 * 簡單的1對多的的數據關係,使用到的表有:Groups(注意點:Group是數據庫中的關鍵字),User,其中Groups是一,User是多
 * 使用到的類:Group,User;配置文件:Group.xml,User.xml
 * 步驟:
 * 一、新建實體類Group和User
 * 二、新建映射文件Group.hbm.xml和User.hbm.xml
 * 三、在配置文件hibernate.cfg.xml配置文件中聲明映射文件
 * 四、新建測試類測試功能模塊
 * 注意點:
 * 一、在映射文件中定義映射的表不能是關鍵字,其中Group是關鍵字,因此一直報語法錯誤
 * */
public class Test_1 {
    private static SessionFactory sessionfactory;
    private static Session session;
    public static void main(String[] args){
        //配置
        Configuration config = new Configuration().configure();
        //註冊服務
        ServiceRegistry service = new ServiceRegistryBuilder().applySettings(config.getProperties())
                .buildServiceRegistry();
        
        //實例化sessionfactory工廠
        sessionfactory = config.buildSessionFactory(service);
        //打開一個session
        session = sessionfactory.openSession();
        
        //添加
        add();
        
        //查詢
        sel();

        //修改
        //update();
        
        //刪除
        del();
    }
    //添加語句
    public static void add(){
        Transaction transaction = session.beginTransaction();
        Group g = new Group();
        g.setGtitle("學生會");
        User u = new User("張三");
        User u1 = new User("李四");
        g.getUsers().add(u);
        g.getUsers().add(u1);
        //注意點:須要保存組的對象
        session.save(g);
        session.save(u);
        session.save(u1);
        transaction.commit();
    }
    
    //查詢語句
    public static void sel(){
        Group g = (Group) session.get(Group.class, 1);
        System.out.println(g.getGtitle()+","+g.getUsers().size());
        
        for(User u: g.getUsers()){
            System.out.println(u.getUname());
        }
    }
    
    //修改語句
    public static void update(){
        Group g = (Group)session.get(Group.class,1);
        g.setGtitle("技術會");
        for(User u : g.getUsers()){
            if(u.getUname().equals("張三")){
                u.setUname("陳凱輝");
                g.getUsers().add(u);
            }
        }
        Transaction transaction = session.beginTransaction();
        session.save(g);
        transaction.commit();
    }
    //刪除語句
    //注意級聯事件
    public static void del(){
        Group g = (Group)session.get(Group.class, 1);
        Transaction transaction = session.beginTransaction();
        session.delete(g);
        transaction.commit();
    }
}

效果圖爲:測試

 

總結:

相關文章
相關標籤/搜索