- 说明
- 下面这几篇博客主要介绍Hibernate中各种映射关系如何来使用,并结合一些实用的例子来进行讲解以及各种属性的含义和设置,首先说一下多对一映射关系,多对一相比大家都已经知道这里也不是主要介绍多对一映射什么含义,也不是说表结构怎么设计,而是这种关系如何在对象模型中体现出来以及从对象模型映射到关系模型,这才是这篇博客的重点。
- 对象模型结构图
- 这是一张简单的权限管理里面的类图有两个类,一个是User类另一个是Group类,把用户分为不同的组来表示,显然他们之间是聚合关系,如下图:
- 在前面我们已经学过聚合关系在代码里面怎么样表示,依赖对象应该含有被依赖对象的一个引用(聚合也是一种依赖),如果知道这一点很容易写出这两个实体对应的代码。
- User
-
package com.bjpowernode.hibernate; public class User { private int id; private String name; private Group group; public Group getGroup() { return group; } public void setGroup(Group group1) { this.group = group1; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
- Group
-
package com.bjpowernode.hibernate; public class Group { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
- 通过xml文件映射到数据库中
- 文件里面有一些映射语句、属性什么的各种说明已经都写在了注释里面,我们直接看看注释就会明白了也可以参照以前的一点点经验来理解这一部分映射,从最简单的普通映射开始到实体--表映射。
- Group.hbm.xml
-
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping > <!-- 默认情况生成表名与实体名一样,为了不与数据库关键字冲突,table属性可以给表起别名 --> <class name="com.bjpowernode.hibernate.Group" table="t_group"> <id name="id"> <!-- native会自动识别数据库类型,根据不同数据库生成主键,自增 --> <generator class="native"></generator> </id> <property name="name"></property> </class> </hibernate-mapping> <!-- 解释 几个属性--> <!-- 在没有使用Hibernate框架之前,你是否记得自己写的实体类,一个实体类对应于一个表,它的 属性对于于数据库表字段,这种对应关系在我们心里成了一个不成文的规定。 但是在Hibernate中同样是这样滴,只不过它把这种对应关系抽象出来了,形成了一种可以配置 的文件,我们就感觉多了一些东西,其实是没有多什么,这就是简单实体类的普通映射关系 --> <!-- 解释 几个属性-->
-
- User.hbm.xml
-
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping > <class name="com.bjpowernode.hibernate.User" table="t_user"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <!-- 解释 几个属性--> <!-- many-to-one用来指定同哪个表关联,默认会拿到该表的主键放到这里。 这里加入了column属性是为了避免group与SQL的Group关键字冲突,给列起名。 cascade属性表示级联保存,当保存User实体时也会像Group表中自动插入记录。 --> <!-- 解释 几个属性--> <many-to-one name="group" column="groupId" cascade="save-update"></many-to-one> </class> </hibernate-mapping>
-
- 插入数据后,可以看到如下结果
- 这是映射的简单小例子,以后将会详细介绍。