Hibernate框架之多表查询

1、多表设计(总结)

(1)多表关系
        1)一对一:
            表的设计原则(分表原则):
                优化表的性能
                基于语意化分表     
            一对一的两张表 之间的关系怎么维护?
                主外键
                相同主键值
       2)一对多:
            建表原则:
                在一的一方有主键   主表
                多的一方有与主表的主键相关联外键    从表
        3)多对多
            建表原则:
                两种主表(业务表) 中间存在一张中间表 
                中间表内部维护两个外键
                中间表分为两种:
                    仅仅维护关系的中间表
                    不仅存在维护关系的外键 还有其他业务字段 例如:订单表     订单项表     商品表
(2)多表设计
        1)根据业务设计表模型
        2)分析表的关系:    分方向  看一条(起始表)
        3)一对一设计:     

学生表            学籍表

        4)一对多设计:

客户表        联系人表
百度          张三
jd            李四
google        王武
              赵六
              田七
              孙八

        5)多对多设计(权限5张表):
            1、通过用户名和密码才能登陆
            2、系统有不同的职务
            3、不同的职务可以有不同的权限


            
用户表            职务表(角色表)            权限表(菜单表、功能表)    
            
张三                CEO                        查下自己薪资
李四                CTO                        查看全部人薪资
王武                CFO                        请假
田七                COO                        批假
                    程序员                    查看项目进度
                                              查看项目金额
                                                    
                                                    
     用户角色关系表            角色权限关系表

2、Hibernate一对多的操作

实体类结构:

//客户表:
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 linkmanSet = new HashSet();//多的一方集合

//联系人表
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;//'联系人qq',
private String lkm_position;// '联系人职位',
private String lkm_memo;//'联系人备注',
//lkm_cust_id` bigint(32) NOT NULL COMMENT '客户id',
private Customer customer;//一的一方对象

配置映射关系:



    
        
            
        
        
        
        
        
        
        

        
        
            
            
        
    




    
        
            
        
        
        
        
        
        
        
        
        

        
        
    

配置核心参数:


    
        com.mysql.jdbc.Driver
        jdbc:mysql:///hibernate
        root
        root

        org.hibernate.dialect.MySQLDialect
        true
        true
        update

        
        
    

测试:

public class OneToManyTets {

    //对象导航查询
    @Test
    public void test3(){
        Session session = HibernateUtils.openSession();
        Transaction transaction = session.beginTransaction();

        Customer customer = session.get(Customer.class, 5l);
        Set linkmanSet = customer.getLinkmanSet();
        for(Linkman linkman : linkmanSet){
            System.out.println(linkman.getLkm_id()+"   "+linkman.getLkm_name());
        }

        //测试导航对象
        Linkman linkman = session.get(Linkman.class, 1l);
        System.out.println("Customer:"+customer.getCust_name());
        System.out.println("Linkman:"+linkman.getLkm_name());

        transaction.commit();
        HibernateUtils.close(session);
    }

    //级联删除
    @Test
    public void test2(){
        Session session = HibernateUtils.openSession();
        Transaction transaction = session.beginTransaction();

        //Linkman linkman = session.get(Linkman.class, 6l);
        //session.delete(linkman);
        Customer customer = session.get(Customer.class, 9l);
        session.delete(customer);

        transaction.commit();
        HibernateUtils.close(session);
    }

    //一对多存储、级联保存
    @Test
    public void test1(){
        Session session = HibernateUtils.openSession();
        Transaction transaction = session.beginTransaction();

        Customer customer = new Customer();
        Linkman linkman1 = new Linkman();
        Linkman linkman2 = new Linkman();
        customer.setCust_name("CF");
        linkman1.setLkm_name("盖比");
        linkman2.setLkm_name("拉伦多");
        //维护关系
        customer.getLinkmanSet().add(linkman1);
        customer.getLinkmanSet().add(linkman2);
        linkman1.setCustomer(customer);
        linkman2.setCustomer(customer);
        //保存
        session.save(customer);
        //session.save(linkman1);
        //session.save(linkman2);

        transaction.commit();
        HibernateUtils.close(session);
    }
}

3、Hibernate多对多的操作

实体类结构

//用户实体类
    private long user_id;//'用户id',
    private String user_code;// '用户账号',
    private String user_name;// '用户名称',
    private String user_password;// '用户密码',
    private String user_state;// '1:正常,0:暂停',
    private Set roles = new HashSet();//多对多集合

//角色实体类
    private long role_id;
    private String role_name;//'角色名称',
    private String role_memo;// '备注',
    private Set users = new HashSet();//多对多集合

配置映射关系



    
        
            
        
        
        
        
        

		
        
            
            
        
    





    
        
            
        
        
        

        
            
            
        
    

配置核心配置参数


    
        com.mysql.jdbc.Driver
        jdbc:mysql:///hibernate
        root
        root

        org.hibernate.dialect.MySQLDialect
        true
        true
        update

        
        
    

测试

public class ManyToManyTest {
    @Test
    public void test02(){
        Session session = HibernateUtils.openSession();
        Transaction transaction = session.beginTransaction();

        //给用户添加角色
        User user = session.get(User.class, 9l);
        Role role = session.get(Role.class,13l);
        role.getUsers().add(user);
        session.save(role);

        transaction.commit();
        HibernateUtils.close(session);
    }

    @Test
    public void test01(){
        Session session = HibernateUtils.openSession();
        Transaction transaction = session.beginTransaction();

        //添加用户和角色
        User user01 = new User();
        User user02 = new User();
        Role role01 = new Role();
        Role role02 = new Role();
        user01.setUser_name("魔兽世界");
        user02.setUser_name("LOL");
        role01.setRole_name("摩登莫西");
        role02.setRole_name("路西多亚");
        user01.getRoles().add(role01);
        user02.getRoles().add(role02);
        role01.getUsers().add(user01);
        role02.getUsers().add(user02);
        session.save(role01);
        session.save(role02);
        session.save(user01);
        session.save(user02);

        transaction.commit();
        HibernateUtils.close(session);
    }
}

你可能感兴趣的:(Hibernate框架之多表查询)