Hibernate关系映射之一对多

本文介绍Hibernate框架中的一对多关系映射方法,包括实体类定义、XML映射文件配置及增删改查操作示例。
关系映射
    一对一(one-to-one)
    一对多(one-to-many)
    多对一(many-to-one)
    多对多(many-to-many)


一对多:通过"一"方持有"多"方的集合实现,即在"一"的一端中使用<set>元素表示持有"多"的一端的对象

1 、插入数据 (班级->学生)
**Grade.java:**

package com.lxj.entity;

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

public class Grade {
    private int gid;
    private String gname;
    private String gdesc;

    public Grade(){}

    public Grade(String gname, String gdesc) {
        this.gname = gname;
        this.gdesc = gdesc;
    }

    private Set<Student> students = new HashSet<Student>();

    public void setStudents(Set<Student> students){
        this.students = students;
    }

    public Set<Student> getStudents(){
        return students;
    }

    public int getGid() {
        return gid;
    }

    public void setGid(int gid) {
        this.gid = gid;
    }

    public String getGname() {
        return gname;
    }

    public void setGname(String gname) {
        this.gname = gname;
    }

    public void setGdesc(String gdesc) {
        this.gdesc = gdesc;
    }
    public String getGdesc() {
        return gdesc;
    }



    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Grade grade = (Grade) o;

        if (gid != grade.gid) return false;
        if (gname != null ? !gname.equals(grade.gname) : grade.gname != null) return false;
        if (gdesc != null ? !gdesc.equals(grade.gdesc) : grade.gdesc != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = gid;
        result = 31 * result + (gname != null ? gname.hashCode() : 0);
        result = 31 * result + (gdesc != null ? gdesc.hashCode() : 0);
        return result;
    }
}


**Grade.hbm.xml:**
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="com.lxj.entity.Grade" table="grade" schema="hibernate_study">
        <id name="gid" column="gid" type="java.lang.Integer">
            <generator class="increment"></generator>
        </id>
        <property name="gname" column="gname" type="java.lang.String" />
        <property name="gdesc" column="gdesc" type="java.lang.String"/>
        <!--配置单向的一对多关联关系-->
        <set name="students" table="student">
            <!--指定关联的外键-->
            <key column="gid"></key>
            <one-to-many class="com.lxj.entity.Student"></one-to-many>
        </set>

    </class>
</hibernate-mapping>


**Student.java**

package com.lxj.entity;

public class Student {
    private int sid;

    public Student(String sname, int sex) {
        this.sname = sname;
        this.sex = sex;
    }

    private String sname;
    private int sex;
    private int gid;

    public Student(){

    }



    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public int getGid() {
        return gid;
    }

    public void setGid(int gid) {
        this.gid = gid;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Student student = (Student) o;

        if (sid != student.sid) return false;
        if (sex != student.sex) return false;
        if (gid != student.gid) return false;
        if (sname != null ? !sname.equals(student.sname) : student.sname != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = sid;
        result = 31 * result + (sname != null ? sname.hashCode() : 0);
        result = 31 * result + sex;
        result = 31 * result + gid;
        return result;
    }
}


**Student.hbm.xml:**
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="com.lxj.entity.Student" table="student" schema="hibernate_study">
         <id name="sid" column="sid" type="java.lang.Integer">
            <generator class="increment"></generator>
        </id>
        <property name="sname" column="sname"/>
        <property name="sex" column="sex"/>
        <property name="gid" column="gid"/>
    </class>
</hibernate-mapping>

**Test.java**

import com.lxj.entity.Grade;
import com.lxj.entity.Student;
import com.lxj.util.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Test {

    @org.junit.Test
    public void testAddGrade(){

        Grade g = new Grade("java-1班","最牛逼的班级");
        Student student1 = new Student("张三",0);
        Student student2 = new Student("女神",1);

        //设置班级、学生关联关系
        g.getStudents().add(student1);
        g.getStudents().add(student2);

        Session session = HibernateUtil.getSession();
        Transaction transaction = session.beginTransaction();
        session.save(g);
        session.save(student1);
        session.save(student2);

        transaction.commit();
        HibernateUtil.closeSession();
    }
}


**HibernateUtil.java:**
package com.lxj.util;

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

public class HibernateUtil {
    private static SessionFactory sessionFactory;
    private static Session session;
    private static Transaction transaction;

    static {
        Configuration configuration = new Configuration().configure();
        sessionFactory = configuration.buildSessionFactory();
    }

    /**
     * 获取session工厂
     * @return
     */
    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }

    /**
     * 获取session
     * @return
     */
    public static Session getSession(){
        session = sessionFactory.openSession();
        return session;
    }

    /**
     * 关闭session
     */
    public static void closeSession(){
        if(session != null){
            session.close();
        }
    }
}


**hibernate.cfg.xml:**
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>

    <session-factory>
        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate_study</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>

        <!-- 配置hibernate的基本信息 -->

        <!-- 配置数据库方言dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="hibernate.current_session_context_class">thread</property>
        <!-- 指定自动生成数据表的策略 -->
        <property name="hbm2ddl.auto">update</property>


        <mapping resource="com/lxj/entity/Grade.hbm.xml"/>
        <mapping resource="com/lxj/entity/Student.hbm.xml"/>
    </session-factory>
</hibernate-configuration>


2、查询数据(单向从班级查询学生)

    /**
     * 通过班级查询当前班级下的学生
     */
    @org.junit.Test
    public void getStudentsByGrade(){

        Session session = HibernateUtil.getSession();
        int gid = 1;
        Grade grade = (Grade) session.get(Grade.class,gid);
        System.out.println(grade.getGname());

        //查询该班级下的学生
        Set<Student> students = grade.getStudents();
        Iterator<Student> iter = students.iterator();
        while (iter.hasNext()){
            Student student = (Student)iter.next();
            System.out.println(student.getSname());
        }
    }


3、修改一个学生信息
    @org.junit.Test
    public void updateStudentGrade(){
        Grade g = new Grade("java-3班","一般般");
        Session session = HibernateUtil.getSession();
        //这个人之前属于java-1班,现在修改到3班
        Student stu = (Student)session.get(Student.class,1);
        Transaction transaction = session.beginTransaction();
        g.getStudents().add(stu);
        session.save(g);
        transaction.commit();
        HibernateUtil.closeSession();
    }


4、删除学生信息
    @org.junit.Test
    public void deleteStudent(){

        Session session = HibernateUtil.getSession();
        Transaction transaction = session.beginTransaction();
        Student student = session.get(Student.class,1);
        session.delete(student);
        transaction.commit();
        HibernateUtil.closeSession();
    }


5、Entity.hbm.xml中的set标签常用属性:
    <set name="students" table="student">
            <!--指定关联的外键-->
            <key column="gid"></key>
            <one-to-many class="com.lxj.entity.Student"></one-to-many>
     </set>

     name:映射类属性的名称(必须)
     table:表名(非必须)
     lazy:指定关联对象是否使用延迟加载(非必须,proxy)
     inverse:标识双象关联中被动的一方(非必须,false
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值