Hibernate中的映射配置

本文详细介绍了Hibernate中的四种映射类型:关系映射(1对1、1对多、多对1、多对多)、组件映射、集合映射以及继承映射,并提供了相应的配置示例,涵盖了外键关联、主键关联、单向和双向关联等多种情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hibernate中的映射分类:4类:

关系映射
1对1 (双向)
外键关联:
<!-- 一对一外键关联映射(持有外键一方) -->
 <!--
 <class name="hibernate.pojo.Computer" table="t_computer">
  <id name="id" column="id" type="integer">
   <generator class="identity" />
  </id>
  <property name="name" column="name" type="string" />
  <many-to-one name="student" class="hibernate.pojo.Student"
   column="s_id" unique="true" cascade="all" />
 </class>
  -->


<!-- 一对一外键关联映射(持有主键方) -->
 <!--
 <class name="hibernate.pojo.Student" table="t_student">
  <id name="id" column="id" type="integer">
   <generator class="identity"/>
  </id>
  <property name="name" column="name" type="string" />
  <one-to-one name="computer" class="hibernate.pojo.Computer" property-ref="student" cascade="delete" />
 </class>
  -->

主键关联:

 <!-- 一对一主键关联映射(引用外键作为主键一方) -->
  <class name="hibernate.pojo.Computer" table="t_computer">
   <id name="id" column="id" type="integer">
    <generator class="foreign">
     <param name="property">student</param>
    </generator>
   </id>
   <property name="name" column="name" type="string" />
   <!-- cascade取值{none all save-update delete} -->
   <one-to-one name="student" class="hibernate.pojo.Student" constrained="true" cascade="all"/>
  </class>

 <class name="hibernate.pojo.Student" table="t_student">
  <id name="id" column="id" type="integer">
   <generator class="identity"/>
  </id>
  <property name="name" column="name" type="string" />
  <one-to-one name="computer" class="hibernate.pojo.Computer" cascade="all"/>
</class>

1对多(单向)
<class name="hibernate.pojo.Dept" table="t_dept">
  <id name="id" column="id" type="integer">
   <generator class="identity"/>
  </id>
  <property name="dname" column="dname" type="string" />
  <set name="emps" table="t_emp" cascade="delete" inverse="true">
   <key>
    <column name="deptno"/>
   </key>
   <one-to-many class="hibernate.pojo.Emp" />
  </set>
 </class>

多对1(单向)
 <class name="hibernate.pojo.Emp" table="t_emp">
  <id name="id" column="id" type="integer">
   <generator class="identity" />
  </id>
  <property name="ename" column="ename" type="string" not-null="true" unique="true"/>
  <many-to-one name="dept" class="hibernate.pojo.Dept"
   column="deptno" cascade="save-update" not-null="true"/>
 </class>

多对多(双向)
<class name="hibernate.pojo.Student" table="t_student">
  <id name="id" column="id" type="integer">
   <generator class="identity"/>
  </id>
  <property name="name" column="name" type="string" />
  <set name="courses" table="t_stu_cou" cascade="save-update">
   <key column="s_id" />
   <many-to-many class="hibernate.pojo.Course" column="c_id"/>
  </set>
 </class>

<class name="hibernate.pojo.Course" table="t_course">
  <id name="id" column="id" type="integer">
   <generator class="identity"/>
  </id>
  <property name="name" column="name" type="string" />
  <set name="students" table="t_stu_cou" cascade="save-update">
   <key>
    <column name="c_id" />
   </key>
   <many-to-many class="hibernate.pojo.Student" column="s_id" />
  </set>
</class>

组件映射:
 <component name="contact" class="hibernate.pojo.Contact">
   <property name="address" column="address" type="string" />
   <property name="email" column="email" type="string" />
   <property name="phone" column="phone" type="string" />
   <property name="qq" column="qq" type="string" />
 </component>
集合映射:
Bag:长度任意、可以有重复元素、无顺序
<bag name="addresses" table="t_address">
 <key column="s_id" />
 <element column="address" type="string" />
</bag>
Array:可以保存任意类型、长度固定
Set:长度不固定、无顺序、不能存在重复元素,可以有一个为空
<set name="books" table="t_books" cascade="all">
 <!--
 <key>
  <column name="s_id" />
 </key>
 <element>
  <column name="bname" />
  <type name="string" />
 </element>
  -->
 <key column="s_id" />
 <element column="bname" type="string" />
</set>
List:长度不固定、有顺序、可以有重复元素
<list name="phones" table="t_phone">
 <key  column="s_id"/>
 <list-index column="list_index" base="0" />
 <element column="phone" type="string" />
</list>
Map:Key=Value key不能重复,可以有一个为null,值可以重复
<map name="language" table="t_language">
 <key column="s_id" />
 <map-key type="integer" column="map_key" />
 <element column="language" type="string"/>
</map>

继承映射:(3种映射方式)
class Person{
 private int id;
 private String name;
 private String sex; 
}
class Student extends Person{
 private String school;
}
class Employee extends Person{
 private String company;
}


1、每棵类继承树,将有继承关系的多个实体,保存到一张表中,需要一张表
t_person表:

id name  sex  school  company  flag(鉴别器)
1 张三 男 北京大学 NULL  s
2 李四 女 NULL  IBM  e

 <!-- 每棵类继承树 -->
 <class name="Person" table="t_person">
  <id name="id" column="id" type="integer">
   <generator class="identity" />
  </id>
  <!-- 添加一个鉴别器,用来指定子类的类别 -->
  <discriminator column="flag" type="string" />
  <property name="name" column="name" type="java.lang.String" />
  <property name="sex" column="sex" type="string" />
 <subclass name="Student" discriminator-value="s">
  <property name="school" column="school" type="string" />
 </subclass>
 <subclass name="Employee" discriminator-value="e">
  <property name="company" column="company" type="string" />
 </subclass>
 </class>
 <!--
 <subclass name="hibernate.pojo.Student"
  extends="hibernate.pojo.Person" discriminator-value="s">
  <property name="school" column="school" type="string" />
 </subclass>
 <subclass name="hibernate.pojo.Employee"
  extends="hibernate.pojo.Person" discriminator-value="e">
  <property name="company" column="company" type="string" />
 </subclass>
  -->


2、每个类一张表,需要3张表
t_person表
id  name sex
1 张三 男
2 李四 女

t_student表
p_id(fK) school
1  北京大学

t_employee表
p_id(FK) company
2  IBM

<!-- 每个类一张表 -->
 <class name="Person" table="t_person">
  <id name="id" column="id" type="integer">
   <generator class="identity" />
  </id>
  <property name="name" column="name" type="java.lang.String" />
  <property name="sex" column="sex" type="string" />
  <joined-subclass name="Student" table="t_student">
   <key column="p_id" />
   <property name="school" column="school" type="string" />
  </joined-subclass>
  <joined-subclass name="Employee" table="t_employee">
   <key column="p_id" />
   <property name="company" column="company" type="string" />
  </joined-subclass>
 </class>
 <!--
  <joined-subclass name="Student" extends="Person" table="t_student">
  <key column="p_id"/>
  <property name="school" column="school" type="string" />
  </joined-subclass>
  <joined-subclass name="Employee" extends="Person" table="t_employee">
  <key column="p_id"/>
  <property name="company" column="company" type="string" />
  </joined-subclass> 
 -->

3、每个具体类一张表需要2张表
t_student表
id(PK)  name sex school
1 梁涛 男 北京大学

t_employee表
id(PK) name sex company
2 李四 女 IBM

<!-- 每个具体类一张表 -->
 <class name="Person" abstract="true">
  <!-- 具体类一张表,主键需设置为手动或是UUID -->
  <id name="id" column="id" type="integer">
   <generator class="assigned" />
  </id>
  <property name="name" column="name" type="java.lang.String" />
  <property name="sex" column="sex" type="string" />
  <union-subclass name="Student" table="t_student">
   <property name="school" column="school" type="string" />
  </union-subclass>
  <union-subclass name="Employee" table="t_employee">
   <property name="company" column="company" type="string" />
  </union-subclass>
 </class>
 <!--
  <union-subclass name="Student" extends="Person" table="t_student">
  <property name="school" column="school" type="string" />
  </union-subclass> 
  <union-subclass name="Employee"  extends="Person" table="t_employee">
  <property name="company" column="company" type="string" />
  </union-subclass>
 -->

 

                                                                                     平时总结,希望与大家分享,如有错误,请提出提评。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值