### Hibernate笔记2 #### 上次课程的主要知识点回顾 在上一节的学习中,我们主要探讨了Hibernate的基础概念及其核心功能,包括如何配置Hibernate环境、基本的CRUD操作以及简单的对象关系映射(ORM)。其中特别强调了Hibernate如何帮助开发者简化数据库操作的过程,使Java应用程序能够更加高效地与数据库进行交互。 #### 本次预计讲解的知识点 本节我们将深入讨论如何在Hibernate中处理具有继承关系的对象,具体来说是如何设计实体层以支持不同的子类类型,并且通过示例来展示三种不同的数据库表设计策略。 ### 具体内容 #### 实体层设计 当在项目中遇到实体类之间存在继承关系的情况时,比如一个基类`Car`和它的两个子类`Bus`和`Truck`,我们需要考虑如何有效地利用Hibernate来管理和存储这些对象。在这种情况下,通常会有以下几种表设计策略: 1. **表每类 (Table Per Class)** - **定义**:为每一个Java类创建一张对应的数据库表。 - **示例**:分别创建`Car`表、`Bus`表和`Truck`表。其中`Bus`和`Truck`表分别只存储各自的特有属性(如`Bus`表中的`person`字段,`Truck`表中的`weight`字段),而所有类共有的属性(如`id`、`color`、`count`)都放在`Car`表中。 - **优缺点**:此策略最简单直观,但是可能会导致数据冗余,尤其是在多级继承结构中。 2. **表每继承树 (Table Per Subclass)** - **定义**:为基类创建一张表,然后为每一个子类创建一张表。 - **示例**:在本例中,为`Car`类创建一张表,表名为`car`,用于存储所有`Car`实例的基本属性;为`Bus`类创建一张表,表名为`bus`,仅包含`Bus`特有的属性(`person`);为`Truck`类创建一张表,表名为`truck`,仅包含`Truck`特有的属性(`weight`)。 - **优缺点**:这种方式避免了数据冗余的问题,但查询时可能需要联表操作,增加了复杂度。 3. **表每表 (Table Per Concrete Class)** - **定义**:为每个具体的子类创建一张表。 - **示例**:本例中,创建三张表,分别为`car`、`bus`和`truck`,每张表存储各自子类的所有属性,包括从基类`Car`继承的属性。 - **优缺点**:此策略可以减少联表查询的需求,但会导致表的数量增加。 #### 映射文件示例 接下来,我们将通过具体的代码示例来看一下如何在Hibernate中实现上述第二种策略——表每继承树(Table Per Subclass)。 ```xml <hibernate-mapping> <class name="org.liky.entity.pojo.Car" table="car" catalog="testdb"> <id name="id" type="java.lang.Integer"> <column name="id"/> <generator class="native"/> </id> <property name="color" type="java.lang.String"> <column name="color" length="20" not-null="true"/> </property> <property name="count" type="java.lang.Integer"> <column name="count" not-null="true"/> </property> <!-- 表示Car类有一个子类Bus,与数据库中的bus表对应 --> <joined-subclass name="org.liky.entity.pojo.Bus" table="bus"> <!-- 该子类的表,通过id字段与父类表关联 --> <key column="id"/> <property name="person" type="java.lang.Integer"> <column name="person" not-null="true"/> </property> </joined-subclass> <!-- 表示Car类有一个子类Truck,与数据库中的truck表对应 --> <joined-subclass name="org.liky.entity.pojo.Truck" table="truck"> <key column="id"/> <property name="weight" type="java.lang.Double"> <column name="weight" not-null="true"/> </property> </joined-subclass> </class> </hibernate-mapping> ``` 在上面的映射文件中,我们首先定义了`Car`类的基本属性,并通过`joined-subclass`元素指定了其子类`Bus`和`Truck`的信息。这里`key`元素用于指定关联主键的字段。 #### 总结 通过上述内容的学习,我们可以看到在Hibernate中如何灵活地设计实体层以适应不同的业务需求。针对具有继承关系的对象,我们可以选择合适的表设计策略来优化数据存储和查询效率。同时,通过映射文件的具体配置,我们可以实现不同类型的对象与数据库表之间的有效映射,从而提高程序的可维护性和扩展性。
剩余26页未读,继续阅读
- 粉丝: 0
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助