Hibernate多对多映射

来源:互联网 发布:mac无线键盘出现乱键 编辑:程序博客网 时间:2024/05/22 16:53

(1)在数据库的底层,一般采用中间表的形式来实现,即新增一张包含关联双方主键的关联表
(2)在双方的实体中添加一个保存对方的集合
(3)在双方的映射文件中使用<set> 元素和<many-to-many> 进行关联关系的配置。

先看数据库表的建立

create table project{    pid int primary key,    pname varchar(20) not null};create table employee(    eid int primary key,    ename varchar(20));create table proemp(    rpid int,    reid int);alter table proemp add constraint fk1 foreign key (rpid) references project(pid);alter table proemp add constraint fk2 foreign key (reid) references employee(eid);

再添加对方的集合

public class Employee {    private int eid;    private String ename;    private Set<Project> projects = new HashSet<Project>();}
public class Project {    private int pid;    private String pname;    private Set<Employee> employees = new HashSet<Employee>();}

最后在映射文件中配置

<!-- 配置多对多关联关系 -->        <!-- 关联关系交由Project方处理 -->        <set name="projects" table="proemp" inverse="true">            <key column="reid"></key>            <many-to-many class="com.imooc.entity.Project" column="rpid"></many-to-many>        </set>
<!-- 配置多对多关联关系 -->        <set name="employees" table="proemp" cascade="all">            <key column="rpid"></key>            <many-to-many class="com.imooc.entity.Employee" column="reid"></many-to-many>        </set>

测试方法如下:

Project project1 = new Project(1001, "项目1");        Project project2 = new Project(1002, "项目2");        Employee employee1 = new Employee(1, "傻比1");        Employee employee2 = new Employee(2, "傻比2");        /*         *项目到雇员的关系          */        project1.getEmployees().add(employee1);        project1.getEmployees().add(employee2);        project2.getEmployees().add(employee1);        Session session = HibernateUtil.getSession();        Transaction tx = session.beginTransaction();        session.save(project1);        session.save(project2);        tx.commit();

输出的sql语句为:

Hibernate: select employee_.eid, employee_.ename as ename2_0_ from employee employee_ where employee_.eid=?Hibernate: select employee_.eid, employee_.ename as ename2_0_ from employee employee_ where employee_.eid=?Hibernate: insert into project (pname, pid) values (?, ?)Hibernate: insert into employee (ename, eid) values (?, ?)Hibernate: insert into employee (ename, eid) values (?, ?)Hibernate: insert into project (pname, pid) values (?, ?)Hibernate: insert into proemp (rpid, reid) values (?, ?)Hibernate: insert into proemp (rpid, reid) values (?, ?)Hibernate: insert into proemp (rpid, reid) values (?, ?)
0 0
原创粉丝点击