对象关系映射(ORM)的基本认识在之前的两篇博客中已有体现了。
今天来学习的是Hibernate的对象关系映射。
Hibernate的几种映射方式
基本映射
Hibernate中映射的配置在XML中,我们要对object和table进行映射转换,只需要配置XML即可,所以学会使用Hibernate,重点也就在配置文件中的配置。
首先我们从基本映射开始,如下例:
1、User实体类:
import java.util.Date;
public class User {
private String id;
private String name;
public String getId() {
return id;
}
// public void setId(String id) {
// this.id = id;
// }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2、映射文件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">
<!-- 1、映射文件的根节点,导入包名 -->
<hibernate-mapping package="com.bjpowernode.hibernate">
<!--2、class和table的映射,name属性是实体名,table属性是表名(table可省略,则name即是映射的表名)-->
<class name="User" table="t_user">
<!--3、主键映射,name属性是实体类的标识符属性,对应table的主键,即用column表示(column同样可省略)-->
<id name="id" column="user_id" length="32" access="field">
<!--主键生成器,class属性表示生成策略,根据不同的需求选择-->
<generator class="uuid"/>
</id>
<!--4、其他属性的映射-->
<property name="name" length="30" unique="true" not-null="true"/>
</class>
</hibernate-mapping>
3、在Hibernate.cfg.xml中添加映射文件User.hbm.xml
<hibernate-configuration>
<session-factory>
<!--Mysql Database connection settings -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">ssh</property>
<!-- SQL dialect方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 打印sql语句 -->
<property name="hibernate.show_sql">true</property>
<mapping resource="com/tgbzjj/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
以上就是最基本的映射实现,很简单,其中比较重要的一点是主键生成。
为什么要用主键生成?
每个实体对象都是唯一的,需要去标识,表通过主键标识,实体通过在配置文件中使用<id>标识,而主键必须提供。
主键生成策略
从上面代码中看到,这里使用的是<generator class="uuid"/>uuid生成策略,uuid只是主键生成策略中的一种。
hibernate主键生成采用策略模式进行设计,各个生成策略都直接或或者间接实现了IdentifierGenerator接口,此接口只有一个方法publicSerializablegenerate(SessionImplementorsession,Objectobject)throwsHibernateException;这个方法由各个类实现具体的生成逻辑。
Hibernate的主键生成策略有很多中,但大致可以分为三类:
1、不需要和数据库交互就可以生成id的:uuid,uuid2,uuid.hex
说明:不需要和数据库交互,指的是在实体对象在瞬时状态即生成了主键值。
好处:不需要和数据库交互,速度较快
2、需要和数据库交互以生成id的:guid、identity、sequence、native、foreign
说明:需要和数据库交互生成,需要经过一次查询才能生成
identity:MySQL,SQL server的生成方式,自增序列
sequence:Oracle的生成方式,自增序列
native:identity+sequence,屏蔽了数据库的差异
foreign:只适用基于共享主键的一对一关联映射的时候使用。即一个对象的主键是参照的另一张表的主键生成的。
3、不用交互,自己管理:assigned
说明:主键我们手动设置(因为需求)。
策略的选择
主键要唯一,主键最好适用分布式,主键最好不要自己维护,最后保证效率,所以说就推荐uuid,其特点也就是生成主键唯一,且对数据库无依赖,可移植性强。当前真是需求需要了其他的生成策略那就根据需求而定了,比如流水号的生成,有一定的生成方式,而且唯一,那流水号就可以作为主键,使用assigned策略了。
总结
Hibernate的映射是HIbernate的重点,基本映射只是映射的开始,是最基本的,接下来总结关系映射,关系映射即有了实体和实体之间的关系,根据需求理清了关系,映射也就出来了,会用很简单。