zoukankan      html  css  js  c++  java
  • Hibernate的映射组成关系

    建立域模型(Java的对象模型)和关系数据模型(数据库表模型)有着不同的出发点:
      域模型: 由程序代码组成, 通过细化持久化类的的粒度(就是通过把相同的属性,规划为一个类)可提高代码的可重用性, 简化编程
      关系模型:在没有数据冗余的情况下, 应该尽可能减少表的数目, 简化表之间的参照关系, 以便提高数据的访问速度

    Hibernate 把持久化类的属性分为两种:
        值(value)类型: 没有 OID, 不能被单独持久化, 生命周期依赖于所属的持久化类的对象的生命周期
        实体(entity)类型: 有 OID, 可以被单独持久化, 有独立的生命周期 显然无法直接用 property 映射实体类属性
        Hibernate 使用 <component> 元素来映射组成关系(就是可能多个持久类组成一个表), 该元素表名 pay 属性是 Worker 类一个组成    部分, 在 Hibernate 中称之为组件

    Example:
      新建一个worker类:

    package com.atguigu.hibernate.entities;
    
    public class Worker {
        
        private Integer id;
        private String name;
        
        private Pay pay;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Pay getPay() {
            return pay;
        }
    
        public void setPay(Pay pay) {
            this.pay = pay;
        }
        
        
        
    }

    而worker类又包含了一个pay类:

    package com.atguigu.hibernate.entities;
    
    public class Pay {
        
        private int monthlyPay;
        private int yearPay;
        private int vocationWithPay;
        
        private Worker worker;
        
        
        
        public Worker getWorker() {
            return worker;
        }
        public void setWorker(Worker worker) {
            this.worker = worker;
        }
        public int getMonthlyPay() {
            return monthlyPay;
        }
        public void setMonthlyPay(int monthlyPay) {
            this.monthlyPay = monthlyPay;
        }
        public int getYearPay() {
            return yearPay;
        }
        public void setYearPay(int yearPay) {
            this.yearPay = yearPay;
        }
        public int getVocationWithPay() {
            return vocationWithPay;
        }
        public void setVocationWithPay(int vocationWithPay) {
            this.vocationWithPay = vocationWithPay;
        }
        
        
        
    }

    问题就来了,如何把这两个类同时放在一个表里面呢???

    可以通过.hbm.xml文件来配置

      我们可以使用<component>标签来指定一个类中包含的类

      

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 2014-1-2 16:14:33 by Hibernate Tools 3.4.0.CR1 -->
    <hibernate-mapping package="com.atguigu.hibernate.entities">
        <class name="Worker" table="WORKER">
            <id name="id" type="java.lang.Integer">
                <column name="ID" />
                <generator class="native" />
            </id>
            <property name="name" type="java.lang.String">
                <column name="NAME" />
            </property>
            
            <!-- 映射组成关系 -->
            <component name="pay" class="Pay">
                <parent name="worker"/>
                <!-- 指定组成关系的组件的属性 -->
                <property name="monthlyPay" column="MONTHLY_PAY"></property>
                <property name="yearPay" column="YEAR_PAY"></property>
                <property name="vocationWithPay" column="VOCATION_WITH_PAY"></property>
            </component>
            
        </class>
    </hibernate-mapping>

    这样就可以把多个持久化的类指定为一个表,

     

        

  • 相关阅读:
    基于策略模式简单实现element表单校验
    跨域
    原型模式
    单例模式
    vue-router进阶篇
    vue-router
    h5深度剖析
    js同步异步,任务队列
    JavaScript中事件委托(事件代理)详解
    网络请求get和post的区别
  • 原文地址:https://www.cnblogs.com/jeremy-blog/p/4011554.html
Copyright © 2011-2022 走看看