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>
这样就可以把多个持久化的类指定为一个表,
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。