标签:hibernate
对象关系映射(ORM)的基本认识在之前的两篇博客中已有体现了。
今天来学习的是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;这个方法由各个类实现具体的生成逻辑。
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的重点,基本映射只是映射的开始,是最基本的,接下来总结关系映射,关系映射即有了实体和实体之间的关系,根据需求理清了关系,映射也就出来了,会用很简单。
标签:hibernate
原文地址:http://blog.csdn.net/akkzhjj/article/details/40481423