组件映射与继承映射
2016-06-23 22:02
330 查看
组件映射与继承映射
组件映射
类组合关系的映射,也叫做组件映射!注意:组件类和被包含的组件类,共同映射到一张表!
需求: 汽车与车轮
public class Car { private int id; private String name; // 车轮 private Wheel wheel; } // 车轮 public class Wheel { private int count; private int size; } <hibernate-mapping package="cn.csx.d_component"> <class name="Car" table="t_car"> <id name="id"> <generator class="native"></generator> </id> <property name="name" length="20"></property> <!-- 组件映射 --> <component name="wheel"> <property name="size"></property> <property name="count"></property> </component> </class> </hibernate-mapping>
继承映射
需求:动物,猫,猴子简单继承映射
// 动物类 public abstract class Animal { private int id; private String name; <!-- 简单继承 --> <hibernate-mapping package="cn.csx.e_extends1"> <class name="Cat" table="t_Cat"> <!-- 简单继承映射: 父类属性直接写 --> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <property name="catchMouse"></property> </class> </hibernate-mapping> @Test public void getSave() { Session session = sf.openSession(); session.beginTransaction(); // 保存 // Cat cat = new Cat(); // cat.setName("大花猫"); // cat.setCatchMouse("抓小老鼠"); // session.save(cat); // 获取时候注意:当写hql查询的使用,通过父类查询必须写上类的全名 Query q = session.createQuery("from cn.csx.e_extends1.Animal"); List<Animal> list = q.list(); System.out.println(list); session.getTransaction().commit(); session.close(); }
所有子类映射到一张表 (1张表)
总结: 写法较为简单:所有子类用一个映射文件,且映射到一张表! 但数据库设计不合理! (不推荐用。)
每个类映射一张表(3张表)
<!-- 继承映射, 每个类对应一张表(父类也对应表) --> <hibernate-mapping package="cn.csx.e_extends3"> <class name="Animal" table="t_animal"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <!-- 子类:猫 t_cat key 指定_cat表的外键字段 --> <joined-subclass name="Cat" table="t_cat"> <key column="t_animal_id"></key> <property name="catchMouse"></property> </joined-subclass> <!-- 子类:猴子 t_monkey --> <joined-subclass name="Monkey" table="t_monkey"> <key column="t_animal_id"></key> <property name="eatBanana"></property> </joined-subclass> </class> </hibernate-mapping>
总结: 一个映射文件,存储所有的子类; 子类父类都对应表; 缺点:表结构比较负责,插入一条子类信息,需要用2条sql: 往父类插入、往子类插
(推荐)每个子类映射一张表, 父类不对应表(2张表)
<hibernate-mapping package="cn.csx.j_hbm_extends3"> <!-- 采用每个具体类一张表的方式,抽象类不对应表。 abstract默认为false,设为true表示本类不对应表(类可以不是abstract的),这时就会忽略table属性。 --> <class name="Article" abstract="false" table="article3"> <id name="id"> <!-- 当使用每个具体类一张表的方式时,主键生成策略不能是identity。 因为在整个继承结构中,主键值是不能重复的。 --> <generator class="hilo"> <param name="table">hi_value</param> <param name="column">next_value</param> <param name="max_lo">100</param> </generator> </id> <property name="title"/> <property name="content" type="text" length="10000"/> <property name="postTime" type="timestamp"/> <!-- 子类:Topic --> <union-subclass name="Topic" table="topic3"> <property name="type"/> </union-subclass> <!-- 子类:Reply --> <union-subclass name="Reply" table="reply3"> <property name="floor"/> </union-subclass> </class> </hibernate-mapping>
总结: 所有的子类都写到一个映射文件; 父类不对应表; 每个子类对应一张表
相关文章推荐
- 15.1
- BZOJ1854: [Scoi2010]游戏
- 详解Java集合框架的接口和类层次关系
- 2021发工资咯:)
- HDU 1063 && POJ 1001 Exponentiation (JAVA浮点数大数)
- 有道词典python 代码(暂有缺憾)
- Centos6.8 64位编译安装PF_RING心得和总结
- leetcode 205 Isomorphic Strings
- SDWebImage原理
- LNMP环境搭建之--YUM仓库
- C++学习心得
- hash储存机制
- Harris角点检测原理及实现
- octave高画质图像处理字节数限制问
- 【Python学习日记】递归实现hanoi塔
- 解决:tomcat部署时deploy location不能显示加载后的路径【转载
- 思科基础命令大全
- [疯狂Java]面向对象:继承、覆盖、super
- java try...catch...finally机制详解
- requirejs讲解