hibernate组件映射和继承映射

素颜马尾好姑娘i 2022-07-13 04:43 275阅读 0赞
  1. 组件映射

类的关系:

  1. wheel.java
  2. public class Wheel {
  3. private String brandname;
  4. private int size;
  5. }
  6. Car.java
  7. public class Car {
  8. private int id;
  9. private String name;
  10. private Wheel wheel;
  11. }

映射文件:组件中使用的关键字是 component

  1. <hibernate-mapping package="lin.hibernate_03.d_component">
  2. <class name="Car" table="car03">
  3. <id name="id" column="id">
  4. <generator class="native"></generator>
  5. </id>
  6. <property name="name" column="name" length="20"></property>
  7. <component name="wheel" class="Wheel">
  8. <property name="brandname" column="brandname"></property>
  9. <property name="size" column="size" ></property>
  10. </component>
  11. </class>
  12. </hibernate-mapping>

继承映射

0.简单映射

Center

注意:当Animal的子类有很多的时候,就会有很多子类对应的表,那么如何查询出来所有的
Animal子类对象的记录?HQL “FROM Animal”,此时报错为没有指定的hbm文件,因此需要
在HQL语句查询的时候指定全类名。HQL “fromcn.itcast.extend.Animal”即可

1.继承结构使用一张表:

类的关系:

  1. Animal.java
  2. public class Animal {
  3. private int id;
  4. private String name;
  5. }
  6. Cat.java
  7. public class Cat extends Animal{
  8. private String catchmouse;
  9. }
  10. Monkey.java
  11. public class Monkey extends Animal{
  12. private String eatBanana;
  13. }

映射文件:要配置discriminator,否则报错

  1. <hibernate-mapping package="lin.hibernate_03.e_exteends1">
  2. <class name="Animal" table="animal03">
  3. <id name="id" column="id">
  4. <generator class="native"></generator>
  5. </id>
  6. <discriminator column="type_"></discriminator> // 建立type_字段,区分表中的关系
  7. <property name="name" length="20"></property>
  8. <!-- 子类:cat -->
  9. <subclass name="Cat" discriminator-value="cat"> // 给type_字段赋值,该默认值是类的全名
  10. <property name="catchmouse"></property>
  11. </subclass>
  12. <!-- 子类:monkey -->
  13. <subclass name="Monkey" discriminator-value="monkey" >
  14. <property name="eatBanana"></property>
  15. </subclass>
  16. </class>
  17. </hibernate-mapping>

运行结果:

Center 1

写法较为简单:所有子类用一个映射文件,且映射到一张表!但数据库设计不合理!(不推荐用。)

2.每个类一张表

类的关系:

同上。

映射文件:关键字是:joined-subclass

  1. <hibernate-mapping package="lin.hibernate_03.e_exteends2">
  2. <class name="Animal" table="animal03">
  3. <id name="id" column="id">
  4. <generator class="native"></generator>
  5. </id>
  6. <property name="name" length="20"></property>
  7. <!-- 子类:cat -->
  8. <joined-subclass name="Cat">
  9. <key column="cat_id"></key>
  10. <property name="catchmouse" ></property>
  11. </joined-subclass>
  12. <!-- 子类:monkey -->
  13. <joined-subclass name="Monkey">
  14. <key column="monkey_type"></key>
  15. <property name="eatBanana" ></property>
  16. </joined-subclass>
  17. </class>
  18. </hibernate-mapping>

运行结果:

Center 2Center 3Center 4

一个映射文件,存储所有的子类; 子类父类都对应表;缺点:表结构比较复杂,插入一条子类信息,需要用2条sql:往父类插入、往子类插入!

3.父类不对应表
类的关系:

同上。

映射文件:关键字是“union-subclass”

  1. <hibernate-mapping package="lin.hibernate_03.e_exteends3">
  2. <class name="Animal" abstract="true"> // abstract意思该类是抽象类,是不创建表,在Animal.java,public后面不需要写“abstract”
  3. <id name="id" column="id">
  4. <generator class="uuid"></generator> // 主键生成策略,不能再用“native”,需要手动生成或“uuid”
  5. </id>
  6. <property name="name" length="20"></property>
  7. <!-- 子类:Cat -->
  8. <union-subclass name="Cat" table="cat_">
  9. <property name="catchmouse"></property>
  10. </union-subclass>
  11. <!-- 子类:Monkey -->
  12. <union-subclass name="Monkey" table="monkey_">
  13. <property name="eatBanana"></property>
  14. </union-subclass>
  15. </class>
  16. </hibernate-mapping>

运行结果:

Center 5

Center 6

所有的子类都写到一个映射文件;**父类不对应表; 每个子类对应一张表**

发表评论

表情:
评论列表 (有 0 条评论,275人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Hibernate映射

    ![这里写图片描述][SouthEast] ![这里写图片描述][SouthEast 1] 如果有侵权行为,请告知,将会马上删除!!! —————信息来自《JavaEE框

    相关 hibernate映射

    我们有时候有一张数据库表,但是这个数据库表中有几列的数据都是类似的,可以使用一个独立的实体类来表示,这个就叫做组件映射,即有个实体类或者多个实体类对应一张数据库表,遇到这个组件