天天看点

Hibernate映射(一)——基本映射 Hibernate的几种映射方式基本映射主键生成策略总结

对象关系映射(ORM)的基本认识在之前的两篇博客中已有体现了。

ORM基础认识

浅谈ORM的映射方案

今天来学习的是Hibernate的对象关系映射。

Hibernate的几种映射方式

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的重点,基本映射只是映射的开始,是最基本的,接下来总结关系映射,关系映射即有了实体和实体之间的关系,根据需求理清了关系,映射也就出来了,会用很简单。

继续阅读