many-to-one和one-to-many和many-to-many

假如说有个班级表:gid ,gname 学生表sid,sname。那么配置文件中该如何配置呢?

一个班级(grad)对应多个学生(student) 这就是一对多,要配置一对多 就要在 一方(grade)的实体类里建一个多方(student)实体集合如private Set students=new HashSet();

简单的列就不说了,直接说重点:

**

一对多

**

在Grade.xml文件里:

<set name="students" table="t_student">

    <!--Column 是指定关联的外键列 这里的gid 是Student中gid -->

    <key column="gid"></key>

    <one-to-many  class="包名.Student"/>

</set>

**

多对一

**

同理要在 多方(Student)的实体类 建一个 一方(Grade)的引用 (不是集合) ,private Grade grade;

在Student.xml文件里:

Column 是指定关联的外键列 这里的gid 是Grade中gid

<many-to-one name="grade" class="包名.Grade" column="gid">
</many-to-one>

**

多对多

**
(老师表和学生表)

<hibernate-mapping>
    <class name="com.db.Student" table="student" catalog="mydb">
        <id name="sid" type="java.lang.Integer">
            <column name="sid" />
            <generator class="native" />
        </id>
        <property name="sname" type="java.lang.String">
            <column name="sname" length="32" />
        </property>
        <!-- 通过table属性告诉hibernate中间表,cascade指明级联操作的类型,inverse属性说明Student实体类是主控方,负责维护关系表 --> 
        <set name="teachers" table="teacher_student" cascade="save-update,delete" inverse="false">
       <!--
                    使用<set>标签映射集合(set),标签中的name值为对象属性名(集合roles)
                    而使用table属性是用于生成第三方表名称,例:table="user_role"
                    但是第三方面中的字段是自动加入的,作为外键分别指向其它表。  
                     所以用<key>标签设置,例:<key column="userid"/>
                     意思是:在第三方表(user_role)中加入一个外键并且指向当前的映射实体类所对应的表(user)
                     使用<many-to-many>来指定此映射集合所对象的类(实例类)
                     并且使用column属性加入一个外键指向Role实体类所对应的表(role) 
      --> 
            <key>
                <column name="sid" not-null="true" />
            </key>
             <!-- 通过column项告诉hibernate对teacher表中查找tid值相应的teacher记录 --> 
            <many-to-many class="com.db.Teacher" column="tid"/>
        </set>
    </class>
</hibernate-mapping>
<hibernate-mapping>
    <class name="com.db.Teacher" table="teacher" catalog="mydb">
        <id name="tid" type="java.lang.Integer">
            <column name="tid" />
            <generator class="native" />
        </id>
        <property name="tname" type="java.lang.String">
            <column name="tname" length="32" />
        </property>
        <!-- 通过table属性告诉hibernate中间表,cascade指明级联操作的类型,inverse属性说明Teacher实体类是被控方,不负责维护关系表 ,不能触发对象和数据库的同步更新的。-->
        <set name="students" table="teacher_student" inverse="true"
            cascade="save-update,delete">
            <key>
                <column name="tid" not-null="true" />
            </key>
            <many-to-many class="com.db.Student" column="sid" />
        </set>
    </class>
</hibernate-mapping>

原文链接----传送门0
原文链接----传送门1
原文链接----传送门2

原创文章 40 获赞 49 访问量 1万+

猜你喜欢

转载自blog.csdn.net/KnightHONG/article/details/105522237