您的位置:首页 > 其它

hibernate组件映射和继承映射

2016-12-25 16:04 232 查看
组件映射
类的关系:

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