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>
-->
平时总结,希望与大家分享,如有错误,请提出提评。