Hibernate 中 一对多、多对一、 关联关系的 配置

来源:互联网 发布:js new一个对象 编辑:程序博客网 时间:2024/05/19 13:55

多对一:(街道→区县)

  • * TBLJd.java 类*
public class TblJd implements java.io.Serializable {    // Fields    private Integer jdid;    private TblQx tblQx;    private String jd;    private Set tblFwxxes = new HashSet();    ......    }
  • TblJd.hbm.xml:
    <class name="com.qbz.entity.TblJd" table="TBL_JD" schema="dbo" catalog="zf">        <id name="jdid" type="java.lang.Integer">            <column name="jdid" />            <generator class="native" />        </id>        <many-to-one name="tblQx" class="com.qbz.entity.TblQx" fetch="select" lazy="false" cascade="all">            <column name="qxid" not-null="true" />        </many-to-one>        <property name="jd" type="java.lang.String">            <column name="jd" length="50" />        </property>    </class>
  • < many-to-one >元素建立了 tblQx 属性和 TBL_JD 表的的外键 qxid 的映射关系,其包括以下属性:
    • name : 设定待映射的持久化类的属性名,此处为 TblJd 类的 tblQx 属性。
    • column:设定和持久化类的属性对应的外键,此处为TBL_JD表的外键 qxid。
    • class:设定持久化类的属性类型,此处设定 tblQx 类型为 com.qbz.entity.TblQx。


一对多:(街道→房屋信息)

  • TblJd.hbm.xml:
    <class name="com.qbz.entity.TblJd" table="TBL_JD" schema="dbo" catalog="zf">        <id name="jdid" type="java.lang.Integer">            <column name="jdid" />            <generator class="native" />        </id>        <many-to-one name="tblQx" class="com.qbz.entity.TblQx" fetch="select" lazy="false" cascade="all">            <column name="qxid" not-null="true" />        </many-to-one>        <property name="jd" type="java.lang.String">            <column name="jd" length="50" />        </property>        <set name="tblFwxxes" inverse="true" lazy="false">            <key>                <column name="jdid" />            </key>            <one-to-many class="com.qbz.entity.TblFwxx" />    </class>
  • < set >元素建立了tblFwxxes 属性在数据库中的映射关系。
    • set : 表明 TblJd 类的 tblFwxxes 属性为 java.util.set 集合类型。
    • key : 表明 TBL_FWXX 表通过外键 jdid 参照 TBL_JD表。
    • one-to-many : 表明 tblFwxxes 集合中存放的是一组 TblFwxx 对象。

  • 其中:
    • inverse: 表示关系的维护由谁来执行。true 表示不由自己执行,而有对应的另外一方执行。false 则相反,表示由自己维护关系。
    • inverse 属性在< one-to-many >中,如果由one来维护,那么性能会非常低。因为,many 方的每一次操作,one方都要维护一次双方的关系。
    • cascade : 表示是否进行级联操作。all表示所有的操作都进行级联。

多对多:(学生→老师)

  • Student.java 类
public class Student implements java.io.Serializable {    // Fields    private Integer id;    private String name;    private Set teachers = new HashSet(0);    .......    }

  • Teacher.java 类
public class Teacher implements java.io.Serializable {    // Fields    private Integer id;    private String name;    private Set students = new HashSet(0);    .......    }

  • Student.hbm.xml:
<hibernate-mapping>    <class name="com.qbz.entity.Student" table="student" schema="dbo"        catalog="guanxiyingshe">        <id name="id" type="java.lang.Integer">            <column name="id" />            <generator class="native" />        </id>        <property name="name" type="java.lang.String">            <column name="name" length="50" />        </property>        <set name="teachers" inverse="true" table="teacher_student"            schema="dbo" catalog="guanxiyingshe">            <key>                <column name="student_id" not-null="true" />            </key>            <many-to-many entity-name="com.qbz.entity.Teacher">                <column name="teacher_id" not-null="true" />            </many-to-many>        </set>    </class></hibernate-mapping>

  • 对于双向多对多关系,必须把其中一端的属性的inverse 属性配置为true,关联的两端都可以使用< set >元素。

  • 在数据库设计时,需要设计一个中间表 teacher_student ,通过中间表描述学生表和老师表的多对多关系。

  • 其映射文件配置方式与一对多很类似,也需要一个 class 属性来设置关联的属性的类型,column 属性用来设定哪个字段去做外键关联,最后,根据业务需要,将某一方的inverse 属性设置为false。


1、这里比一对多关联多一个 table 属性,table 指向数据库建立的关联的那张表。
2、Key 中的 column : 关联表中和 student 表发生关系的字段。
3、Many-to-many 中的 column 指的是关联表中与 class (com.qbz.entity.Teacher) 关联的字段。
1 0
原创粉丝点击