Hibernate多表關係配置——多對一關係映射

班級和學生兩個實體類,關係以下:java

多對一(many-to-one):多個學生屬於一個班級數據庫

一對多(one-to-many):一個班級有多個學生session

一、班級實體app

package demo.entity;

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

/**
 * 班級
 * @author Don
 * @date:日期:2017年4月10日 時間:下午4:51:56*
 * @version 1.0
 */
public class Cla {
    private int id;
    private String name;
    private String addr;
    private Set<Student> stus=new HashSet<Student>();
    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 String getAddr() {
        return addr;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }
    public Set<Student> getStus() {
        return stus;
    }
    public void setStus(Set<Student> stus) {
        this.stus = stus;
    }
}
View Code

映射關係ide

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- name:實體, table:表名 -->
    <class name="demo.entity.Cla" table="m2o_cla">
        <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 -->
        <id name="Id">
            <!-- Hibernate使用generator類來生成主鍵 -->
            <generator class="identity" />
        </id>
        <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) -->
        <property name="name"  />
        <property name="addr"/>
        
        <!-- inverse:這個屬性(stus) 是否爲關係的維護方,默認值爲false
            若是inverse設置爲true,表示將由對方維護二者之間的關聯關係
         -->
        <!--cascade(級聯)意思是指定兩個對象之間的操做聯動關係,對一個對象執行了操做以後,對其指定的級聯對象也須要執行相同的操做
            all-表明在全部的狀況下都執行級聯操做
            none-在全部狀況下都不執行級聯操做
            save-update-在保存和更新的時候執行級聯操做
            delete-在刪除的時候執行級聯操做
         -->
         <!--lazy:延遲加載,默認true,如學生實體不調用班級實體信息,能夠不用加載  -->
        <set name="stus" inverse="false" cascade="all" lazy="true">
            <!-- 關係維護方的外鍵列 -->
            <key column="cid"></key>
            <one-to-many class="demo.entity.Student" />
        </set>
    </class>
</hibernate-mapping>

 二、學生實體測試

package demo.entity;
/**
 * 學生信息
 * @author Don
 * @date:日期:2017年4月10日 時間:下午4:50:55*
 * @version 1.0
 */
public class Student {
    private int id;
    private String name;
    private int age;
    private Cla cla;
    
    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 int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Cla getCla() {
        return cla;
    }
    public void setCla(Cla cla) {
        this.cla = cla;
    }
    
}
View Code

映射關係ui

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- name:實體, table:表名 -->
    <class name="demo.entity.Student" table="m2o_stu">
        <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 -->
        <id name="Id">
            <!-- Hibernate使用generator類來生成主鍵 -->
            <generator class="identity" />
        </id>
        <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) -->
        <property name="name"  />
        <property name="age"/>
        
        <!-- 對應班級配置中的cid -->
        <many-to-one name="cla" column="cid" cascade="save-update"></many-to-one>
    </class>
</hibernate-mapping>

三、測試上述配置關係this

獲取Session會話公共方法spa

package demo.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

public class HibernateUtil {

    public static Session getCurrentSession() {

        /*
         * 兩種配置文件的加載方式,hibernate.properties只配置數據庫的鏈接方式
         * 屬性文件(hibernate.properties)調用代碼:Configuration cfg = new
         * Configuration(); Xml文件(hibernate.cfg.xml) 調用代碼:Configuration cfg =
         * new Configuration().configure();
         */

        // 加載Hibernate配置信息,默認讀取src下的hibernate.cfg.xml
        Configuration cfg = new Configuration().configure();
        // 也能夠指定hibernate.cfg.xml 的路徑加載
        // Configuration cfg1 = new Configuration().configure(Path);

        /*
         * 應用程序從SessionFactory(會話工廠)裏得到Session(會話)實例。它在多個應用線程間進行共享。
         * 一般狀況下,整個應用只有惟一的一個會話工廠,SessionFactory由Configuration對象建立,
         * 每一個Hibernate配置文件,其實是對SessionFactory的配置
         */
        // 試用配置信息構建sessionFactory
        SessionFactory factory = cfg.buildSessionFactory();
        
        Session session =factory.getCurrentSession();
        
        return session;
    }

}
View Code

3.1保存數據.net

package demo.test;

import org.hibernate.classic.Session;

import demo.entity.Cla;
import demo.entity.Student;
import demo.util.HibernateUtil;

public class TestSave01 {

    public static void main(String[] args) {
        Cla c1 = new Cla();
        c1.setName("一班");
        c1.setAddr("101");
        
        Student stu1= new Student();
        stu1.setName("呂布");
        stu1.setAge(36);
        stu1.setCla(c1);
        
        Student stu2= new Student();
        stu2.setName("趙雲");
        stu2.setCla(c1);
        
        //持久化
        Session session = HibernateUtil.getCurrentSession();
        session.beginTransaction();
        
        session.save(c1);
        
        //儘可能保存真正的維護方對象,即一對多 由多的維護
        session.save(stu1);
        session.save(stu2);    

        session.getTransaction().commit();
    }

}
View Code

3.2查找數據

package demo.test;

import org.hibernate.classic.Session;

import demo.entity.Cla;
import demo.entity.Student;
import demo.util.HibernateUtil;

public class TestFind {

    public static void main(String[] args) {

        // 持久化
        Session session = HibernateUtil.getCurrentSession();
        session.beginTransaction();
        
        Cla cla =(Cla) session.get(Cla.class, 1);
        System.out.println("班級名稱:"+cla.getName());
        System.out.println("班級地址:"+cla.getAddr());
        System.out.println("班級人數:"+cla.getStus().size());
        
        for(Student stu:cla.getStus())
        {
            System.out.println(stu.getName()+":"+stu.getAge());
        }

        session.getTransaction().commit();
    }

}
View Code

3.3刪除數據

package demo.test;

import org.hibernate.classic.Session;

import demo.entity.Cla;
import demo.entity.Student;
import demo.util.HibernateUtil;

public class TestDelete {

    /**
     * @param args
     */
    public static void main(String[] args) {

        // 持久化
        Session session = HibernateUtil.getCurrentSession();
        session.beginTransaction();
        
        /*
         *級聯刪除須要先查詢
         * */
        Cla cla = (Cla)session.get(Cla.class, 1);
        session.delete(cla);

        session.getTransaction().commit();
    }

}
View Code
相關文章
相關標籤/搜索