Hibernate最核心的思想就是面向对象,最直接的体现方式就是映射文件,本篇博客介绍Hibernate中关于实体与关系的几种映射方式。
一、基本映射:
这种映射是最简单的映射,在映射文件中采用<class>标签表示。<class>标签中的name属性是实体的包路径,可以使用table属性设置为表的名称。实体的主键采用<id>标签,普通属性采用<property>标签映射,其中可以使用column属性重新修改属性在数据库表中的字段名称。
<hibernate-mapping package="com.bjpowernode.hibernate">
<class name="User1" table="t_user1">
<id name="id" column="user_id" length="32" access="field">
<generator class="uuid"/>
</id>
<property name="name" length="30" unique="true" not-null="true"/>
<property name="password"/>
<property name="createTime" type="date" column="create_time"/>
<property name="expireTime"/>
</class>
</hibernate-mapping>
另外这里实体的设计需要注意:
1、实现无参的默认构造函数
2、提供一个标识
3、建议不要使用final修饰实体类
4、建议为实体类生成getter和setter方法
二、多对一关联映射:
在数据库中就存在多对一的关系,在Hibernate中自然也存在多对一的关系,如下图所示:
一个用户只能属于一个组,而一个组确可以有多个用户,再比如职工和部门,一个职工只能属于一个部门,一个部门确可以有多个职工。在数据库设计中是在多的一端加入外键,与一的一端建立联系,在Hibernate中同样也是如此,编写的方式就是在多的一端加入<many-to-one>标签,如下所示:
<many-to-one name="group" column="groupid"cascade="save-update"></many-to-one>
这里cascade表示是级联的含义,级联是两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作,它只影响添加、删除、修改,级联的取值all、none、sava-update、delete:
all:代表在所有的情况下都执行级联操作
none:代表在所有的情况下都执行级联操作
save-update:表示在保存和更新的时候执行级联操作
delete:在删除的时候执行级联操作
在User一端加上这个<many-to-one>标签,在数据库中就会多出一个groupid字段,当使用了级联操作,对象模型就会保存在关系模型中,Group和User都是Persistent状态的对象了,及时没有保存Group也不会抛出TransientObjectException异常。
使用了多对一的关联映射,多的一端维护表之间的关系,Hibernate会自动在多的一端添加一个外键,在进行一下添加和删除操作的时候我们不需要考虑表结构,非常方便。