Hibernate 映射
程序员文章站
2022-04-16 22:42:37
...
映射分为关联映射、继承映射、复合主键映射、Component映射、集合映射
1.关联映射 |
参考文章:
Hibernate 一对一 关联关系映射
Hibernate 一对多 关联关系映射
Hibernate 多对一 关联关系映射
Hibernate 多对多 关联关系映射
2.继承映射 |
继承映射分为三种:一棵树一张表;一个类一张表;一个具体类一张表
@1. 一棵树一张表
实现:
- 需要添加鉴别值,鉴别字段必须紧跟
<id>
标签后,用来区分子类(鉴别值在存储时hibernate会自动存储,在加载的时候会根据鉴别值取得相关的对象) - 使用
<subclass>
标签添加子类
映射文件配置如下:
<hibernate-mapping package="com.bjpowernode.hibernate">
<class name="Animal" table ="t_animal" lazy="true">
<id name="id">
<generator class="native" />
</id>
<discriminator column="type" type="string" />
<property name="name" />
<property name="sex" />
<!--子类标签,设置鉴别值-->
<subclass name="Pig" discriminator-value="P" >
<property name="weight" />
</subclass>
<subclass name="Bird" discriminator-value="B">
<property name="height" />
</subclass>
</class>
</hibernate-mapping>
说明:
- 优点:简单
- 缺点:存在冗余字段
- 通过父类,找子类,虽然是根据id查找的,但实际是通过鉴别值自动转换为子类的
@2. 一个类一张表
实现:
- 使用
<joined-subclass>
标签产生关系 - 需要设置子类映射表的主键
映射文件如下:
<class name="Animal" table ="t_animal" lazy="true">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<property name="sex" />
<joined-subclass name="Pig" table="t_pig">
<key column="pid"></key>
<property name="weight" />
</joined-subclass>
<joined-subclass name="Bird" table="t_bird">
<key column="bid"></key>
<property name="height" />
</joined-subclass>
</class>
说明:
- 优点:表简单
- 缺点:当继承多时,查询关联的表多,效率不好
- 子类自动继承父类的属性,跟类的继承一样,子类自动就拥有父类的属性了
@3.一个具体类一张表
实现:
- 使用
<union-subclass>
标签 - 标签添加
abstract="true"
属性
配置文件如下:
<class name="Animal" abstract="true">
<id name="id">
<!--因为不支持自增-->
<generator class="assigned" />
</id>
<property name="name" />
<property name="sex" />
<union-subclass name="Pig" table="t_pig">
<property name="weight" />
</union-subclass>
<union-subclass name="Bird" table="t_bird">
<property name="height" />
</union-subclass>
</class>
说明:
- 缺点:不支持自增
- 注意:Animal类不会生成表的,只有具体类才会生成表
三种策略,建议使用第一种,层次不多时,也可用第二种
3. 复合主键映射 |
实现:
- 使用
<composite-id>
标签,用来添加符合主键
映射文件如下:
<class name="FiscalYearPeriod" table ="t_fiscal_year_period">
<composite-id name="FiscalYearPeriodPK">
<key-property name="fiscalYear" />
<key-property name="fiscalPeriod" />
</composite-id>
<property name="beginDate" type="date"/>
<property name="endDate" type="date"/>
</class>
说明:
- 加载或保存时,操作的主键实体类,因为主键类型为实体类,但数据库实际生成的表是复合主键类的属性字段
4.Component映射 |
实现:
- 使用
<component>
标签
映射文件如下:
<class name="Employee" table ="t_employee">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<component name="employContact">
<property name="email" />
<property name="address" />
<property name="zipCode" />
<property name="contactTel" />
</component>
</class>
说明:
- 使用情况:当多个类有相同属性时,就不用每个类都重复写一遍了
5. 集合映射 |
实现:
- 使用集合标签
映射文件如下
<class name="CollectionMapping" table ="t_collection">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<!--存储无序-->
<set name="setValues" table="t_set_values">
<key column="set_id" />
<element type="string" column="set_value" not-null="true" />
<!--元素若是实体类 <composite-element></composite-element> -->
</set>
<!--存储有序-->
<list name="listValues" table="t_list_values">
<key column="list_id" />
<list-index column="list_index" />
<element type="string" column="list_value" />
</list>
<!--存储有序-->
<array name="arrayValues" table="t_array_values">
<key column="array_id" />
<list-index column="array_index" />
<element type="string" column="array_value" />
</array>
<!--键值对-->
<map name="mapValues" table="t_map_values">
<key column="map_id" />
<map-key type="string" column="map_key" />
<element type="string" column="map_value" />
</map>
</class>
说明:
- 每个集合是一张表
- 主表中只有主键和普通属性
上一篇: Hibernate映射
推荐阅读
-
Atitit.Hibernate中Criteria使用总结and关联查询and按照子对象查
-
Hibernate学习之对实体类的crud操作
-
Mybatis结果集和实体类映射的一个小知识点
-
hibernate自动生成实体类和映射文件
-
HIbernate的配置文件详解
-
struts2+Spring3+hibernate3零配置并且正式环境和开发环境不需要多大改动 Struts
-
eclipse安装hibernate插件方法
-
eclipse安装hibernate插件方法
-
用Jersey构建RESTful服务5-Jersey+MySQL5.6+Hibernate4.3
-
struts2+Spring3+hibernate3零配置并且正式环境和开发环境不需要多大改动 Struts