Hibernate双向多对多对象关系模型映射

1 双向many-to-many

业务模型:

      描述员工和项目

      一个员工同时可以参与多个项目

      一个项目中可以包含多个员工

分析:数据库的数据模型,通过中间关系表,建立两个one-to-many构成many-to-many

create table emp
(
    eno int primary key auto_increment,
    ename varchar
);
create table project
(
    pid int primary key auto_increment,
    pname varchar,
);
create table relationship
(
    eno int,
    pid int,
);

1.1 描述java的数据模型

 

1.2进行pojo的映射配置

  

1.3加载配置文件产生数据库模型

 

在数据库为两个主外键。

1.4进行CRUD操作

1.4.1 添加员工信息

@Test
public void testSaveEmp()
{
    Session session = HibernateSessionFactory.getSession();
    //开启事务
    Transaction tr = session.beginTransaction();
    //创建员工对象
    Emp emp = new Emp();
    emp.setEname("毛主席");
    session.save(emp);
    tr.commit();
    session.close();
}

1.4.2添加项目信息

@Test
public void testSaveProject()
{
    Session session = HibernateSessionFactory.getSession();
    //开启事务
    Transaction tr = session.beginTransaction();
    //创建员工对象
    Project p = new Project();
    p.setPname("渡江战役");
    session.save(p);
    tr.commit();
    session.close();
}

1.4.3添加项目同时分配员工

新添加项目,将项目分配给已经存在的员工

/**
 * 添加项目数据,分配已有员工
 * ****/
@Test
public void saveProjectEmp()
{
    //获得Session
    Session session=sf.openSession();
    //开启事务
    Transaction tr=session.beginTransaction();
    //创建项目对象
    Project p= new Project();
    p.setPname("CRM");
    //查询员工的对象
    List<Emp> elist = session.createCriteria(Emp.class).list();
    //将员工分配给新项目:给中间表插入数据
    p.setEmps(new HashSet(elist));
    session.save(p);
    //提交事务
    tr.commit();
    //释放资源
    session.close();
}

1.4.4解除员工和项目的关系

通过员工解除关系的。

/***
 * 解除员工和项目的关系
 * 删除中间表中的数据
 * ***/
@Test
public void deleteProjectEmp()
{
    //获得Session
    Session session=sf.openSession();
    //开启事务
    Transaction tr=session.beginTransaction();
    //查询员工对象
    Emp emp = (Emp) session.get(Emp.class, 1);
    //获得员工参与的所有项目
    Set<Project> pros=emp.getPros();
    System.out.println(pros);
    //查询项目对象
    Project p=(Project) session.get(Project.class,3);
    System.out.println(p);
    /****
     *
     * set集合中元素的地址和单条查询获得项目对象的地址一样,所有set集合中的项目对象和
     * 单条查询获得的项目对象,是同一个对象,所以pros.remove(p),删除了集合中地址和p一样的对象
     *
     * *****/
    //p.equals(obj);
    //从pros中删除某个项目
    /***
     * 现在关系是由员工断开(默认inverse=false)
     * many-to-many这种情况:保存其中一方的inverse=true
     * ***/
    pros.remove(p);//
    //提交事务
    tr.commit();
    //释放资源
    session.close();
}

1.4.5 给已有项目分配新员工

/***
 * 给已有的项目,分配新的员工(新入职)
 * ***/
@Test
public void saveProjectEmp2()
{
    //获得Session
    Session session=sf.openSession();
    //开启事务
    Transaction tr=session.beginTransaction();
    //start:所有的数据改动都是改动内存中的数据
    //获得项目对象
    Project p= (Project) session.get(Project.class, 4);
    //获得项目的所有员工
    Set<Emp> emps=p.getEmps();
    //创建新的员工对象
    Emp emp= new Emp();
    emp.setEname("小强4");
    //将emp员工对象,添加某个项目对应的员工集合中
    emps.add(emp);
    emp.getPros().add(p);//inverse=true;由员工建立和项目的关系
    //end:当提交事务的时候,本次数据库操作会话需要结束,hibernate自动检查内存中的数据是否和数据库中的一致
    //如果不一致,会将内存中的数据同步到数据
    //提交事务
    tr.commit();
    //释放资源
    session.close();
}

1.4.6通过员工查询项目

员工姓名     项目名称

/***
 * 查询员工姓名    项目名称
 * 关联查询:默认延迟加载 
 * a    b    c
 * ***/
@Test
public void selectProjectEmp()
{
    //获得Session
    Session session=sf.openSession();
    //查询所有的员工
    List<Emp> elist = session.createCriteria(Emp.class).list();
    for(Emp e:elist){
        //获得员工参与的项目的集合
        Set<Project> pros = e.getPros();
        for(Project p:pros){
            System.out.println(e.getEname()+"\t\t"+p.getPname());
        }
    }
    //释放资源
    session.close();
}

1.4.7总结

      Cascade:继续有效,很少delete,常用save-update

      Inverse:必须由一方这是为true反转

      中间关系表:

           建立关系:insert

           断开关系:delete

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值