hibernate组件映射和继承映射
2016-12-25 16:04
232 查看
组件映射
类的关系:
wheel.java
映射文件:组件中使用的关键字是 component
<hibernate-mapping package="lin.hibernate_03.d_component">
<class name="Car" table="car03">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" column="name" length="20"></property>
<component name="wheel" class="Wheel">
<property name="brandname" column="brandname"></property>
<property name="size" column="size" ></property>
</component>
</class>
</hibernate-mapping>
继承映射
0.简单映射
![](https://img-blog.csdn.net/20161225163225372?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzE4MDM1MDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
注意:当Animal的子类有很多的时候,就会有很多子类对应的表,那么如何查询出来所有的
Animal子类对象的记录?HQL “FROM Animal”,此时报错为没有指定的hbm文件,因此需要
在HQL语句查询的时候指定全类名。HQL “fromcn.itcast.extend.Animal”即可
1.继承结构使用一张表:
类的关系:
Animal.java
<class name="Animal" table="animal03">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<discriminator column="type_"></discriminator> // 建立type_字段,区分表中的关系
<property name="name" length="20"></property>
<!-- 子类:cat -->
<subclass name="Cat" discriminator-value="cat"> // 给type_字段赋值,该默认值是类的全名
<property name="catchmouse"></property>
</subclass>
<!-- 子类:monkey -->
<subclass name="Monkey" discriminator-value="monkey" >
<property name="eatBanana"></property>
</subclass>
</class>
</hibernate-mapping>
运行结果:
![](https://img-blog.csdn.net/20161225161619039?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzE4MDM1MDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
写法较为简单:所有子类用一个映射文件,且映射到一张表!但数据库设计不合理!(不推荐用。)
2.每个类一张表
类的关系:
同上。
映射文件: 关键字是:joined-subclass
<hibernate-mapping package="lin.hibernate_03.e_exteends2">
<class name="Animal" table="animal03">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" length="20"></property>
<!-- 子类:cat -->
<joined-subclass name="Cat">
<key column="cat_id"></key>
<property name="catchmouse" ></property>
</joined-subclass>
<!-- 子类:monkey -->
<joined-subclass name="Monkey">
<key column="monkey_type"></key>
<property name="eatBanana" ></property>
</joined-subclass>
</class>
</hibernate-mapping>运行结果:
![](https://img-blog.csdn.net/20161225162020372?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzE4MDM1MDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20161225162046591?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzE4MDM1MDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20161225162113780?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzE4MDM1MDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
一个映射文件,存储所有的子类; 子类父类都对应表;缺点:表结构比较复杂,插入一条子类信息,需要用2条sql:往父类插入、往子类插入!
3.父类不对应表
类的关系:
同上。
映射文件:关键字是“union-subclass”
<hibernate-mapping package="lin.hibernate_03.e_exteends3">
<class name="Animal" abstract="true"> // abstract意思该类是抽象类,是不创建表,在Animal.java,public后面不需要写“abstract”
<id name="id" column="id">
<generator class="uuid"></generator> // 主键生成策略,不能再用“native”,需要手动生成或“uuid”
</id>
<property name="name" length="20"></property>
<!-- 子类:Cat -->
<union-subclass name="Cat" table="cat_">
<property name="catchmouse"></property>
</union-subclass>
<!-- 子类:Monkey -->
<union-subclass name="Monkey" table="monkey_">
<property name="eatBanana"></property>
</union-subclass>
</class>
</hibernate-mapping>运行结果:
![](https://img-blog.csdn.net/20161225162355421?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzE4MDM1MDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20161225162420988?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzE4MDM1MDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
所有的子类都写到一个映射文件;父类不对应表; 每个子类对应一张表
类的关系:
wheel.java
public class Wheel { private String brandname; private int size; }
Car.java public class Car { private int id; private String name; private Wheel wheel; }
映射文件:组件中使用的关键字是 component
<hibernate-mapping package="lin.hibernate_03.d_component">
<class name="Car" table="car03">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" column="name" length="20"></property>
<component name="wheel" class="Wheel">
<property name="brandname" column="brandname"></property>
<property name="size" column="size" ></property>
</component>
</class>
</hibernate-mapping>
继承映射
0.简单映射
注意:当Animal的子类有很多的时候,就会有很多子类对应的表,那么如何查询出来所有的
Animal子类对象的记录?HQL “FROM Animal”,此时报错为没有指定的hbm文件,因此需要
在HQL语句查询的时候指定全类名。HQL “fromcn.itcast.extend.Animal”即可
1.继承结构使用一张表:
类的关系:
Animal.java
public class Animal { private int id; private String name; } Cat.java
public class Cat extends Animal{ private String catchmouse; } Monkey.java
public class Monkey extends Animal{ private String eatBanana; }映射文件:要配置discriminator,否则报错
<hibernate-mapping package="lin.hibernate_03.e_exteends1">
<class name="Animal" table="animal03">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<discriminator column="type_"></discriminator> // 建立type_字段,区分表中的关系
<property name="name" length="20"></property>
<!-- 子类:cat -->
<subclass name="Cat" discriminator-value="cat"> // 给type_字段赋值,该默认值是类的全名
<property name="catchmouse"></property>
</subclass>
<!-- 子类:monkey -->
<subclass name="Monkey" discriminator-value="monkey" >
<property name="eatBanana"></property>
</subclass>
</class>
</hibernate-mapping>
运行结果:
写法较为简单:所有子类用一个映射文件,且映射到一张表!但数据库设计不合理!(不推荐用。)
2.每个类一张表
类的关系:
同上。
映射文件: 关键字是:joined-subclass
<hibernate-mapping package="lin.hibernate_03.e_exteends2">
<class name="Animal" table="animal03">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" length="20"></property>
<!-- 子类:cat -->
<joined-subclass name="Cat">
<key column="cat_id"></key>
<property name="catchmouse" ></property>
</joined-subclass>
<!-- 子类:monkey -->
<joined-subclass name="Monkey">
<key column="monkey_type"></key>
<property name="eatBanana" ></property>
</joined-subclass>
</class>
</hibernate-mapping>运行结果:
一个映射文件,存储所有的子类; 子类父类都对应表;缺点:表结构比较复杂,插入一条子类信息,需要用2条sql:往父类插入、往子类插入!
3.父类不对应表
类的关系:
同上。
映射文件:关键字是“union-subclass”
<hibernate-mapping package="lin.hibernate_03.e_exteends3">
<class name="Animal" abstract="true"> // abstract意思该类是抽象类,是不创建表,在Animal.java,public后面不需要写“abstract”
<id name="id" column="id">
<generator class="uuid"></generator> // 主键生成策略,不能再用“native”,需要手动生成或“uuid”
</id>
<property name="name" length="20"></property>
<!-- 子类:Cat -->
<union-subclass name="Cat" table="cat_">
<property name="catchmouse"></property>
</union-subclass>
<!-- 子类:Monkey -->
<union-subclass name="Monkey" table="monkey_">
<property name="eatBanana"></property>
</union-subclass>
</class>
</hibernate-mapping>运行结果:
所有的子类都写到一个映射文件;父类不对应表; 每个子类对应一张表
相关文章推荐
- hibernate单表之组件映射和继承映射
- 【Hibernate】组件映射与继承映射
- Hibernate第九篇【组件映射、继承映射】
- Hibernate学习-10-组件映射和继承映射
- Hibernate征途(五)之继承映射和组件映射
- 框架 day33 Hibernate,组件映射,继承映射,抓取(检索)策略-优化,检索方式总结
- Hibernate征途(五)之继承映射和组件映射
- Hibernate学习2之继承映射与C3P0连接池
- 【Hibernate框架】三种继承映射
- 041:hibernate组件映射(Annotation)
- 20160509-hibernate--继承映射
- Hibernate继承映射方式一
- Hibernate基础 ( 3 ) 组件属性映射
- Hibernate-----10、继承映射
- 【Hibernate】继承映射
- Hibernate继承映射
- 精通Hibernate之映射继承关系五
- hibernate映射关系——继承映射
- hibernate继承映射
- Hibernate的继承映射、懒加载、缓存