博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hibernate框架一对多&多对多关系的操作(四)
阅读量:7005 次
发布时间:2019-06-27

本文共 5969 字,大约阅读时间需要 19 分钟。

一 数据库表与表之间的关系

总共有一对多关系、多对多关系和一对一关系三种

一对多建表原则:在多的一方添加外键,指向1的一方
多对多建表原则:必须通过中间表
一对一建表原则:可以是建成一张表的(了解)

二 hibernate一对多关联映射

(一)1.准备工作:创建Java project,导入需要的jar包,在数据库中创建客户和联系人的表(客户是一的一方,联系人是多的一方)

导入工具类

2.创建Customer实体类,提供get/set方法(这里由于空间问题省略了)

public class Customer {    //这是一的一方    private Long  cust_id;            private String cust_name;    private String cust_source;    private String cust_industry;    private String cust_level;    private String cust_phone;    private String cust_mobile;    private Set
sets=new HashSet
();}

创建LinkMan实体类

public class LinkMan {    private Long lkm_id;    private String lkm_name;    private String lkm_gender;    private String lkm_phone;    private String lkm_mobile;    private String lkm_email;    private String lkm_qq;    private String lkm_position;    private String lkm_memo;    private Customer customer;   }

3 Customer的一的一方的配置文件

多的一方LinkMan的映射文件

4 创建核心配置文件

5编写测试类

@Test    public void testDemo1(){        Session session = HibernateUtils.getCurrentSession();        Transaction ts = session.beginTransaction();        //两个客户,三个联系人        Customer customer1=new Customer();        customer1.setCust_name("张三");        Customer customer2=new Customer();        customer2.setCust_name("李四");                LinkMan linkMan1=new LinkMan();        linkMan1.setLkm_name("小红");        LinkMan linkMan2=new LinkMan();        linkMan2.setLkm_name("小花");        LinkMan linkMan3=new LinkMan();        linkMan3.setLkm_name("小绿");                //设置关系        linkMan1.setCustomer(customer1);        linkMan2.setCustomer(customer1);        linkMan3.setCustomer(customer2);                customer1.getSets().add(linkMan1);        customer1.getSets().add(linkMan2);        customer2.getSets().add(linkMan3);                session.save(linkMan1);        session.save(linkMan2);        session.save(linkMan3);        session.save(customer1);        session.save(customer2);        ts.commit();    }

成功图:成功插入两个客户,三个联系人

中间遇到的问题:当时只保存了customer客户,没有保存联系人,报了瞬时对象异常

(二)一对多的级联操作

什么叫级联

级联指的是操作一个对象的时候是否会同时操作其关联的对象
级联是有方向性的

保存客户级联联系人

@Test    /**     * 保存客户级联联系人,操作的主体是客户     */    public void demo2(){        Session session = HibernateUtils.getCurrentSession();        Transaction ts = session.beginTransaction();                Customer customer=new Customer();        customer.setCust_name("大鸿");        LinkMan man=new LinkMan();        man.setLkm_name("张三");        man.setCustomer(customer);        customer.getSets().add(man);        session.save(customer);        ts.commit();            }

操作成功图

 

 (三)级联删除

@Test    /**     * 级联删除     * 删除客户,同时删除联系人,操作的客户主体是客户,更改xml中的配置     * 
* */ public void demo5(){ Session session = HibernateUtils.getCurrentSession(); Transaction ts = session.beginTransaction(); Customer customer = session.get(Customer.class, 1l); session.delete(customer); ts.commit(); }

xml中的配置

结果:把一号客户删除,同时删除1号对应的联系人。

三 hibernate多对多关联映射

 (一)1.创建实体类User

public class User {    private Long user_id;    private String user_code;    private String user_name;    private String user_password;    private String user_state;    private Set
roles=new HashSet
(); }

创建实体类Role

public class Role {    private Long role_id;    private String role_name;    private String role_memo;    private Set
users =new HashSet
();   }

2 创建User实体的映射

创建Role实体的映射

3创建核心配置文件,注意引入映射文件

4创建测试类,保存用户级联角色,在User 的映射文件中配置cascade="save-update" 

@Test    /**     * 保存用户级联角色,操作的主体是用户     */    public void dmeo2() {        //两个用户,三个角色        Session session=HibernateUtils.getCurrentSession();        Transaction ts=session.beginTransaction();        User user1=new User();        user1.setUser_name("王六");            Role role1=new Role();        role1.setRole_name("公关部");                user1.getRoles().add(role1);        role1.getUsers().add(user1);            session.save(user1);        ts.commit();    }

成功图:User表 Role表 中间表

(二)给用户添加一个角色

@Test    public void demo4(){        Session session=HibernateUtils.getCurrentSession();        Transaction ts=session.beginTransaction();        //给四号用户添加一个12号的角色        //先获得四号用户        User user=session.get(User.class, 4l);        Role role=session.get(Role.class, 12l);        //获得所有的角色,再新添加一个        user.getRoles().add(role);        ts.commit();    }

(三)给用户更改一个角色

@Test    public void demo5(){        //给用户改选角色,将原来的10号角色改为11号角色        Session session=HibernateUtils.getCurrentSession();        Transaction ts=session.beginTransaction();            //先获得四号用户        User user=session.get(User.class, 4l);        Role role10=session.get(Role.class, 10l);        Role role11=session.get(Role.class, 11l);        user.getRoles().remove(role10);        user.getRoles().add(role11);        ts.commit();    }

 

转载于:https://www.cnblogs.com/bao6/p/10347781.html

你可能感兴趣的文章