Hibernate(四)一对多映射 补充三:双向多对一关系(学生-->班级)

数据库及其他文件见hibernate(四)一对多映射 补充一:单向一对多关系(班级->学生)

package com.imooc.entity;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 * 班级
 * @author Administrator
 *
 */
public class Grade implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private int gid;
    private String gname;
    private String gdesc;
    //在一方定义一个多方的集合
    private Set<Student> students = new HashSet<Student>();

    public Grade() {
        super();
    }



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



    public Grade(int gid, String gname, String gdesc, Set<Student> students) {
        super();
        this.gid = gid;
        this.gname = gname;
        this.gdesc = gdesc;
    }
    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 String getGdesc() {
        return gdesc;
    }
    public void setGdesc(String gdesc) {
        this.gdesc = gdesc;
    }
    public Set<Student> getStudents() {
        return students;
    }
    public void setStudents(Set<Student> students) {
        this.students = students;
    }


}
<?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>

    <class name="com.imooc.entity.Grade" table="grade" >
        <id name="gid" column="gid" type="java.lang.Integer">
            <generator class="increment"></generator><!--increment Hibernate自增  -->
        </id>
        <property name="gname" type="java.lang.String">
            <column name="gname" length="20" not-null="true"></column>
        </property>
        <property name="gdesc" >
            <column name="gdesc"></column>
        </property>
        <set name="students" table="student">
            <key column="gid"></key>
            <one-to-many class="com.imooc.entity.Student"/>
        </set>
    </class>

</hibernate-mapping>
package com.imooc.entity;

/**
 * 学生
 * @author Administrator
 *
 */
public class Student {

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

    public Student() {
        super();
    }


    private int sid;
    private String sname;
    private String sex;
    private Grade grade;
    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 String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }

    public Grade getGrade() {
        return grade;
    }

    public void setGrade(Grade grade) {
        this.grade = grade;
    }


}
<?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>

    <class name="com.imooc.entity.Student" table="student" >
        <id name="sid" column="sid" type="java.lang.Integer">
            <generator class="increment"></generator><!--increment Hibernate自增  -->
        </id>
        <property name="sname" type="java.lang.String">
            <column name="sname" length="20" not-null="true"></column>
        </property>
        <property name="sex" >
            <column name="sex"></column>
        </property>
        <!-- 配置多对一关联关系 -->
        <many-to-one name="grade" class="com.imooc.entity.Grade" column="gid"></many-to-one>
    </class>

</hibernate-mapping>
package com.imooc.entity;

import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.imooc.util.HibernateUtil;

/**
 * 双向多对一关系(学生--》班级)
 * @author Administrator
 *
 */
public class Test {

    public static void main(String[] args) {
        add();
        //findStudentsByGrade();
        //update();
        //delete();
    }

    //将学生添加到班级
    public static void add(){
        Grade g = new Grade("JAVA一班"," Java软件开发一班 ");
        Student stu1 = new Student("张三","男");
        Student stu2 = new Student("慕女神","女");
        //设置关联关系
        stu1.setGrade(g);
        stu2.setGrade(g);

        g.getStudents().add(stu1);
        g.getStudents().add(stu2);

        Session session = HibernateUtil.getSession();
        Transaction tx =  session.beginTransaction();
        //保存班级
        session.save(g);
        //保存学生
        session.save(stu1);
        session.save(stu2);

        tx.commit();
        HibernateUtil.closeSession(session);
    }
}

/*console执行结果: 下面两条update是赘余的浪费性能,不需要去更新student的gid在student在已经设置。所以可以在one的一方set标签中添加inverse="true",表示由多的一方负责维护关联关系。
    Hibernate: select max(gid) from grade
Hibernate: select max(sid) from student
Hibernate: insert into grade (gname, gdesc, gid) values (?, ?, ?)
Hibernate: insert into student (sname, sex, gid, sid) values (?, ?, ?, ?)
Hibernate: insert into student (sname, sex, gid, sid) values (?, ?, ?, ?)
Hibernate: update student set gid=? where sid=?
Hibernate: update student set gid=? where sid=?
*/

优化一:修改在one的一方set标签中添加inverse=”true”

<?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>

    <class name="com.imooc.entity.Grade" table="grade" >
        <id name="gid" column="gid" type="java.lang.Integer">
            <generator class="increment"></generator><!--increment Hibernate自增  -->
        </id>
        <property name="gname" type="java.lang.String">
            <column name="gname" length="20" not-null="true"></column>
        </property>
        <property name="gdesc" >
            <column name="gdesc"></column>
        </property>
        <!-- <set>节点的inverse属性指定关联关系的控制方向,默认由one方来维护
            关联关系中,inverse="false"则为主动方,由主动方负责维护关联关系
            在一对多关联中,只能设置one方的inverse为true,这将有助于性能的改善 -->
        <set name="students" table="student" inverse="true">
            <key column="gid"></key>
            <one-to-many class="com.imooc.entity.Student"/>
        </set>
    </class>

</hibernate-mapping>

/*
console:执行结果为:

Hibernate: select max(gid) from grade
Hibernate: select max(sid) from student
Hibernate: insert into grade (gname, gdesc, gid) values (?, ?, ?)
Hibernate: insert into student (sname, sex, gid, sid) values (?, ?, ?, ?)
Hibernate: insert into student (sname, sex, gid, sid) values (?, ?, ?, ?)
*/

优化二:保存班级的时候级联保存学生信息
cascade属性
1.all 对所有的操作进行级联操作
2.save-update 执行保存和更新操作时进行级联操作
3.delete 执行删除时进行级联操作
4.none 对所有操作不进行级联操作

<?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>

    <class name="com.imooc.entity.Grade" table="grade" >
        <id name="gid" column="gid" type="java.lang.Integer">
            <generator class="increment"></generator><!--increment Hibernate自增  -->
        </id>
        <property name="gname" type="java.lang.String">
            <column name="gname" length="20" not-null="true"></column>
        </property>
        <property name="gdesc" >
            <column name="gdesc"></column>
        </property>
        <!-- <set>节点的inverse属性指定关联关系的控制方向,默认由one方来维护
            关联关系中,inverse="false"则为主动方,由主动方负责维护关联关系
            在一对多关联中,只能设置one方的inverse为true,这将有助于性能的改善 
            cascade="save-update" 保存和更新时级联操作
            -->
        <set name="students" table="student" inverse="true" cascade="save-update">
            <key column="gid"></key>
            <one-to-many class="com.imooc.entity.Student"/>
        </set>
    </class>

</hibernate-mapping>
<?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>

    <class name="com.imooc.entity.Student" table="student" >
        <id name="sid" column="sid" type="java.lang.Integer">
            <generator class="increment"></generator><!--increment Hibernate自增  -->
        </id>
        <property name="sname" type="java.lang.String">
            <column name="sname" length="20" not-null="true"></column>
        </property>
        <property name="sex" >
            <column name="sex"></column>
        </property>
        <!-- 配置多对一关联关系 cascade="all" 增删改查student级联操作grade-->
        <many-to-one name="grade" class="com.imooc.entity.Grade" column="gid" cascade="all"></many-to-one>
    </class>

</hibernate-mapping>
package com.imooc.entity;

import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.imooc.util.HibernateUtil;

/**
 * 双向多对一关系(学生--》班级)
 * @author Administrator
 *
 */
public class Test {

    public static void main(String[] args) {
        add();
        //findStudentsByGrade();
        //update();
        //delete();
    }

    //将学生添加到班级
    public static void add(){
        Grade g = new Grade("JAVA一班"," Java软件开发一班 ");
        Student stu1 = new Student("张三","男");
        Student stu2 = new Student("慕女神","女");
        //设置关联关系
        stu1.setGrade(g);
        stu2.setGrade(g);

        g.getStudents().add(stu1);
        g.getStudents().add(stu2);

        Session session = HibernateUtil.getSession();
        Transaction tx =  session.beginTransaction();
        //保存班级时级联保存学生信息
        session.save(g);

        tx.commit();
        HibernateUtil.closeSession(session);
    }

    //查询学生所在班级信息 
    public static void findGradeByStudent(){
        Session session = HibernateUtil.getSession();
        //学生信息
        Student student = (Student) session.get(Student.class, 2);
        System.out.println(student.getSid()+","+student.getSname());

        //班级信息 配置级联关系后直接.出来
        Grade grade = student.getGrade();
        System.out.println(grade.getGid()+","+grade.getGname());
    }
}

/*
    console:执行结果:
    Hibernate: select student0_.sid as sid1_1_0_, student0_.sname as sname2_1_0_, student0_.sex as sex3_1_0_, student0_.gid as gid4_1_0_ from student student0_ where student0_.sid=?
2,慕女神
Hibernate: select grade0_.gid as gid1_0_0_, grade0_.gname as gname2_0_0_, grade0_.gdesc as gdesc3_0_0_ from grade grade0_ where grade0_.gid=?
1,JAVA一班
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值