hibernate进阶---多对多映射

        前面学习了一对多映射,对hibernate的配置有一定大了解,在实际开发中还有一种映射关系就是多对多映射,比如一个公司中开发人员和项目之间就是多对多的关系,一个开发人员可以同时参与几个项目,当然一个项目可以有多个人员参与。

根据幕课网的hibernate视频学习,本文做了一个学习总结,用其中的项目和雇员关系来学习多对多映射。

首先就是在数据库中建立三张表,除了本来的雇员表和项目表外,另外一张表来存储两者之间的关系,以此来实现多对多映射关系。

具体建表代码:

create table employee(
    eid int,
    ename varchar(20) not null
);
create table project(
    pid int,
    pname varchar(20) not null
);
create table rproemp(
    eid int,
    pid int
);
alter table rproemp add constraint fk_project_pid foreign key(pid) references project(pid);
alter table rproemp add constraint fk_employee_eid foreign key(eid) references employee(eid);
当然在实体类里互相之间要保存引用集合,就是在项目类中持有雇员信息集合,而且在雇员类中也要有持有所参加项目的集合。如下
public class Project{
    private int pid;
    private String pname;
    private Set<Employee> emps;

//相应的getter和setter  及构造器等
}
public class Employee{
   private int eid;
   private String ename;
   private Set<Project> pros;

//相应的getter和setter 及构造器等
}

关于映射文件hbm.xml文件的配置:主要需要注意的就是在两个文件中set标签的配置中注意关联的数据表名应该是rproemp表,不再是实体类表,当然一样可以通过inverse和cascade属性来配置关系维护类和级联属性等。具体代码如下:
<hibernate-mapping>
    <class name="com.song.entity.Employee" table="EMPLOYEE">
        <id name="eid" type="int">
            <column name="EID" />
            <generator class="assigned" />
        </id>
        <property name="ename" type="java.lang.String">
            <column name="ENAME" length="20" not-null="true"/>
        </property>
        <!-- 多对多映射关系 -->
        <set name="pros" table="RPROEMP" cascade="true" >
            <key>
            	<!-- employee表与中间关系映射表rproemp表中的对应外键 -->
                <column name="EID" />
            </key>
            <!-- pros所对应的类型及其在rproemp表中所对应的外键 -->
			<many-to-many class="com.song.entity.Project" column="pid"></many-to-many>
        </set>
    </class>
</hibernate-mapping>
<hibernate-mapping>
    <class name="com.song.entity.Prject" table="PRJECT">
        <id name="pid" type="int">
            <column name="PID" />
            <generator class="assigned" />
        </id>
        <property name="pname" type="java.lang.String">
            <column name="PNAME" />
        </property>
        <set name="emps" table="RPROEMP" inverse="true" cascade="true">
            <key>
                <column name="PID" />
            </key>
			<many-to-many class="com.song.entity.Employee" column="EID"></many-to-many>
        </set>
    </class>
</hibernate-mapping>


猜你喜欢

转载自blog.csdn.net/weiguang111/article/details/50529502