hibernate中多对多关系映射

本文介绍Hibernate框架中如何实现多对多关系映射,包括Teacher与Student两个类之间的映射配置及增删查改操作示例。

这篇文章讲的是hibernate中多对多关系映射和相关操作,如有错误或不当之处,还望各位大神批评指正。

多对多关系映射配置

目标

假设一个学生对应于多个老师,而且一个老师对应多个学生,完成相关操作

相关类

1.Teacher类

public class Teacher {
    private Integer id ;
    private String name ;

    private Set<Student>students = new HashSet<>() ;
    //省略get和set方法
}

2.Studet类

public class Student {
    private Integer id ;
    private String name ;
    private float score ;

    private Set<Teacher>teachers = new HashSet<>() ;
}

*.hbm.xml

1.Teacher.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-6-21 11:56:44 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.cn.cmc.model.Teacher" table="TEACHER">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="sequence" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <!-- 
            table:指定中间表的位置
            key:配置本表该列在中间表外键的名称
            many-to-many:配置多对多的映射关系
            column:配置关联类在中间表的外键名
            class:外键对应的类名
         -->
        <set name="students" table="STD_TEACHER">
            <key>
                <column name="T_ID" />
            </key>
            <many-to-many column="S_ID" class="com.cn.cmc.model.Student" />
        </set>
    </class>
</hibernate-mapping>

2.Student.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-6-21 11:56:44 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.cn.cmc.model.Student" table="STUDENT">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="sequence" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="score" type="float">
            <column name="SCORE" />
        </property>
        <!-- 
            table:指定中间表的位置
            key:配置本表该列在中间表外键的名称
            many-to-many:配置多对多的映射关系
            column:配置关联类在中间表的外键名
            class:外键对应的类名
         -->
        <set name="teachers" table="STD_TEACHER" >
            <key>
                <column name="S_ID" />
            </key>
            <many-to-many column="T_ID" class="com.cn.cmc.model.Teacher" />
        </set>
    </class>
</hibernate-mapping>

相关操作

添加操作

Teacher t1 = new Teacher() ;
t1.setName("Mike");

Teacher t2 = new Teacher() ;
t2.setName("John");

Student s1 = new Student() ;
s1.setName("cmc");
s1.setScore(100);

Student s2 = new Student() ;
s2.setName("syl");
s2.setScore(95);

Student s3 = new Student() ;
s3.setName("cjx");
s3.setScore(98);

Student s4 = new Student() ;
s4.setName("cmy");
s4.setScore(90);

t1.getStudents().add(s1) ;
t1.getStudents().add(s2) ;
t2.getStudents().add(s3) ;
t2.getStudents().add(s4) ;


session.save(s1) ;
session.save(s2) ;
session.save(s3) ;
session.save(s4) ;
session.save(t1) ;
session.save(t2) ;

查找操作

Teacher t = (Teacher) session.get(Teacher.class, 123) ;
System.out.println(t.getName());

Iterator<Student> stds = t.getStudents().iterator() ;
while(stds.hasNext()){
    Student std = stds.next() ;
    System.out.println(std.getName());
}

更新操作

Teacher t = (Teacher) session.get(Teacher.class, 123) ;
        t.setName("叶清逸");
        session.update(t);

删除操作

Teacher t = (Teacher) session.get(Teacher.class, 123) ;
        session.delete(t);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值