引言
之前对于hibernate中几种关系映射的编写甚是头疼啊,在这个项目中学习了一个比较好用的技巧,小编在此总结和分享,从而可以更好的加深自己对这个几种关系映射的印象。
西面以这三个实体的关系为例进行总结:
下面先看一下几个实体的映射文件的内容:
Department.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.oa.domain"> <class name="Department" table="itcast_department"> <id name="id"> <generator class="native" /> </id> <property name="name" /> <property name="description" /> <!-- users属性,本类与User类 的 一对多 的关系 --> <set name="users"> <key column="departmentId"></key> <one-to-many class="User" /> </set> <!-- parent属性,本类与Department(上级)的 多对一 的关系 --> <many-to-one name="parent" class="Department" column="parentId"></many-to-one> <!-- children属性,本类与 Department(下级) 的 一对多的关系 --> <set name="children" cascade="delete" order-by="id ASC"> <key column="parentId"></key> <one-to-many class="Department" /> </set> </class> </hibernate-mapping>
User.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.oa.domain"> <class name="User" table="itcast_user"> <id name="id"> <generator class="native" /> </id> <property name="loginName" /> <property name="password" /> <property name="name" /> <property name="gender" /> <property name="phoneNumber" /> <property name="email" /> <property name="description" /> <!-- department属性,本类与Department类的 多对一 的关系 --> <many-to-one name="department" class="Department" column="departmentId"></many-to-one> <!-- roles属性,本类与Role类的 多对多 的关系 --> <set name="roles" table="itcast_user_role" lazy="false" > <key column="userId"></key> <many-to-many class="Role" column="roleId"></many-to-many> </set> </class> </hibernate-mapping>
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.oa.domain"> <class name="Role" table="itcast_role"> <id name="id"> <generator class="native" /> </id> <property name="name" /> <property name="description" /> <!-- users属性,本类与User类的 多对多的 关系 --> <set name="users" table="itcast_user_role"> <key column="roleId"></key> <many-to-many class="User" column="userId"></many-to-many> </set> <!-- privileges属性,本类与Privilege类的 多对多的关系 --> <set name="privileges" table="itcast_role_privilege" lazy="false"> <key column="roleId"></key> <many-to-many class="Privilege" column="privilegeId"></many-to-many> </set> </class> </hibernate-mapping>
先给出几种关系编写模型
多对一: <many-to-one name="" class="" column=""></many-to-one> 一对多(Set): <set name=""> <key column=""></key> <one-to-many class=""/> </set> 多对多(Set): <set name="" table=""> <key column=""></key> <many-to-many class="" column=""></many-to-many> </set>
第一、写注释(有规则)以department中的uers属性为例
<!-- users属性,本类与User的一对多 --> 格式:?属性,本类与?的? ?1 属性名 ?2 关联的类型 ?3 关系
这样大家在看看上面映射文件中几种关系的说明都是这样的格式
第二、将对应的空的类型模板复制到对应的注释下面
第三步、填空
将注释(注释要按照要求来写)中
xxx属性中的xxx当做name的值。
本类与yyy类中的yyy当做class的值
下面是填充column的规则,分为两组 一对多与多对一是一组,多对多是一组。
多对一与一对多,这种不需要中间表,将“一”的一方的实体的名称首字母小写然后后面加上Id,将这个值分别作为这一组的column的值。比如下面的例子