Hibernate映射(一)——基本映射

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

ORM基础认识

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

时间: 2024-12-23 00:42:38

Hibernate映射(一)——基本映射的相关文章

Hibernate的七种映射关系之七种关联映射(二)

继续上篇博客 七.Hibernate双向一对多关联映射:让多的一端来维护关系. 主要是解决一对多单向关联的缺陷,而不是需求驱动的. 1.在Student.java实体类里添加Classes引用.private Classes classes; 2.Student.hbm.xml里添加many-to-one标签:<many-to-one name="classes" column="classesid"/>.Classes.hbm.xml在例子(六)里的那

Hibernate的七种映射关系之七种关联映射(一)

关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 一.Hibernate多对一关联映射:就是在"多"的一端加外键,指向"一"的一端. 比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系. 1."多"端实体加入引用"一"端实体的变量及getter,setter方法. 比如说多个学生对应一个班级,在学生实体类加入:private Grade grade; 2."多"端配置文

hibernate从零开始到各种映射

ORM(对象/关系数据库映射) 对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.它完成了面向对象的编程语言到关系型数据库的映射㈣.ORM框架可以看成应用程序和数据库之间的桥梁,通过它,我们可以以面向对象的方式建模.操作,易用.易理解,同时也可以利用关系型数据库系统对数据库访问操作的一些优势.以面向对象的方式操作持久化对象,而ORM框架负责转换成对应的SQL(结构化查询语言)操作. Hibernate概述

Hibernate之1-N关联映射

一.Hibernate之1-N关联映射 1. 哪边是 1 , 哪边是多 ? 需要从业务的角度来说明.例如,Employee 和 Department 之间就是 n-1 的关联关系,Order 和 Customer 之间也是 n-1 的关联关系. 1). 关联关系是有方向的: 2). 如何在类中来建立关联关系呢 ? 解:通过成员变量的方式即可. 2. 单向 n-1 关联关系 1). 域对象中,在 Order 中声明一个 Customer 类型的成员变量,并提供 setter.getter publ

Hibernate在配置表映射文件时cascade的类型及意义

当关联双方存在父子关系,就可以在 set 处设定 cascade 为 all-delete-orphan 所谓父子关系,即指由父方控制子方的持久化圣明周期,子方对象必须和一个父方对象关联.如果删除父方对象,应该级联删除所有关联的子方对象:如果一个子方对象不再和一个父方对象关联,应该把这个子方对象删除. all-deleteorphan 的能力: 1. 当保存或更新父方对象时,级联保存或更新所有关联的子方对象,相当于 cascade 为 save-update 2. 当删除父方对象时,级联删除所有

[原创]java WEB学习笔记82:Hibernate学习之路---映射 一对多关联关系,配置,CRUD方法测试及注意点

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

【Hibernate步步为营】--组合映射详解

上篇文章详细讨论了复合主键的映射原理,对于复合主键映射需要使用<composite-id>标签来标明映射的类属性,并在该标签中添加<key-property>子标签,并且主键列需要实现序列化接口,使用很简单只要学会如何进行映射就可以实现复合映射.接下来讨论组合对象映射,组合映射关系其实是把两个对象的公共部分抽象出来形成一个对象,两个子对象会包含另一个主对像,在配置映射文件时需要使用<component>标签来标明映射关系. 一.组合映射 组合是关联关系的一种特殊情况,是

菜鸟学习Hibernate——一对多关系映射

Hibernate中的关系映射,最常见的关系映射之一就是一对多关系映射例如学生与班级的关系,一个班级对应多个学生.如图: Hibernate中如何来映射这两个的关系呢? 下面就为大家讲解一下: 1.创建实体类Classes和实体类Student Classes.java package com.bjpowernode.hibernate; import java.util.Set; public class Classes { private int id; private String nam

Hibernate中的一对一映射关系

Hibernate中的一对一映射关系有两种实现方法(一对一关系:例如一个department只能有一个manager) I使用外键的方式 步骤:1在一对一关联的持久化类中互相添加对方对象属性,   例如在department中添加private manager manager属性:   department代码如下: package com.atguigu.hibernate.one2one.foreign; public class Department { private Integer d

【Hibernate步步为营】--继承映射详解

上篇文章讨论了多对多映射,在使用多对多映射时重点是使用<many-to-many>标签,并在标签的两端加入外键这样在生成关系时会创建两个关系之间的关系表,通过关系表来维护它们之间的关系,另外对于单向和双向的区别是在映射的哪一端添加标签的问题.在面向对象中很重要的一个特性就是继承,继承实现了代码的复用,而且Hibernate把基本上所有的对象模型进行了映射封装,其中就包括继承映射,接下来就详细讨论. 一.继承映射 继承是面向对象很重要的特性,它实现了代码的服用,在关系模型中同样也有继承关系,这种