前面的Hibernate学习中已经提到过ORM了,对象-关系映射(Object/Relational Mapping,简称ORM),用来把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作实体对象的属性和方法 。ORM通过映射关系自动产生SQL语句,在业务逻辑层和数据层之间充当桥梁。
Hibernate映射共有以下几种:
【基本映射】
映射,首先明白映射的是什么?映射是对实体类和数据库表结构进行了映射,所以这里主要的映射对象有三:一是我们要映射的实体类,二是表示映射关系的映射文件,三是跟数据库有关的配置文件。
1.实体映射类(*.java):
它是对数据库表进行描述,表中的字段在类中被描述成属性,将来就可以实现把表中的记录映射成为该类的对象了。
2. 映射文件(*.hbm.xml):
它是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。
3.数据库配置文件(*.properties/*.cfg.xml):
它是指定与数据库连接时需要的连接信息,比如连接哪种数据库、登录数据库的用户名、登录密码以及连接字符串等,推荐使用xml配置文件,当然还需要把实体映射类的地址映射信息放在这里。
来看一下具体的设计原则和标签属性吧
【详解】
一、实体类的设计原则:
- 实现无参的默认的构造函数
- 提供一个标识
- 建议不要使用final修饰实体类
- 建议为实体类生成getter和setter方法
来看一下具体实例:
1.实体映射类:User1.java
package com.bjpowernode.hibernate;
import java.util.Date;
public class User1 {
private String id;
private String name;
private String password;
private Date createTime;
private Date expireTime;
public String getId() {
return id;
}
// get和set方法略
}
二、映射文件的标签和属性
1.hibernate-mapping标签
①schema (可选): 数据库schema的名称。
②catalog (可选): 数据库catalog的名称。
③default-cascade (可选 - 默认为 none): 默认的级联风格。
④default-access (可选 - 默认为 property):Hibernate用来访问所有属性的策略。可以通过实现PropertyAccessor接口 自定义。
⑤default-lazy (可选 - 默认为 true):指定了未明确注明lazy属性的Java属性和集合类, Hibernate会采取什么样的默认加载风格。
⑥auto-import (可选 - 默认为 true):指定我们是否可以在查询语言中使用非全限定的类名(仅限于本映射文件中的类)。
⑦package (可选): 指定一个包前缀,如果在映射文档中没有指定全限定的类名,就使用这个作为包名。假若有两个持久化类,它们的非全限定名是一样的(就是两个类的名字一样,所在的包不一样),应该设置auto-import="false".如果把一个“import”的名字对应两个类,Hibernate会拋出一个异常hibernate-mapping元素允许嵌套多个<class>映射,但最好的做法是一个持久化类对应一个映射文件,并以持久化的超类名称命名。如:Xxx.hbm.xml
2.class标签
①name(可选):持久化类(或者接口)的Java全限定名。如果这个属性不存在,Hibernate将假定这是一个非POJO的实体映射
②table(可选-默认是类的非全限定名):对应数据库表名,生成DDL时数据表名,如果省略,则名称同持久化类名称
③dynamic-update(可选,默认为false):指定用于UPDATE的SQL将会在运行时动态生成,只更新那些被改过的字段
④dynamic-insert(可选,默认为false):指定用于insert的sql将会在运行时动态生成,并且只包含那些非空字段
⑤optimistic-lock(乐观锁定) (可选,默认是version):决定乐观锁定的策略。
⑥lazy (可选): 通过设置lazy="false",所有的延迟加载(Lazy fetching)功能将被全部(disabled)。
3.id标签
<id>标签必须配置在<class>标签的第一个位置。由一个字段构成主键,<id>元素定义了该属性到数据库表主键字段的映射。
1)name:实体类的属性名字
2)type:标识Hibernate类型的名字(省略则使用Hibernate默认类型),也可以自己配置类型(integer,long,short,float,double,character,byte,boolean,yes_no,true_false)
3)column(可选-默认为属性名):主键字段的名字(省略则取name为字段名)
4)length(可选):当type为varchar时,设置字段长度
5)<generator>元素(主键生成策略)
主键生成策略必须配置,用来为该持久化类的实例生成唯一的标识。
①uuid:
用一个128-bit的UUID算法生成字符串类型的标识符,这在一个网络中是唯一的(使用了IP地址),UUID被编码为一个32位16进制数字的字符串,它的生成是由Hibernate生成,一般不会重复UUID包含:IP地址,JVM的启动时间,系统时间和一个计算器值。
②native:
根据底层数据库的能力选择identity,sequence或者hilo中的一个(数据库自增)
③assigned
让程序在save()之前为对象分配一个表示符。这是<generator>元素没有指定时的默认生成策略。(如果是手动分配,则需要设置此配置)
4.property标签
用于映射普通属性到表字段。
①name: 属性的名字,以小写字母开头。
②column (可选 - 默认为属性名字):对应的数据库字段名。 也可以通过嵌套的<column>元素指定。
③type (可选):一个Hibernate类型的名字。
④update, insert (可选 -默认为 true) : 表明用于UPDATE 和/或 INSERT 的SQL语句中是否包含这个被映射了的字段。这二者如果都设置为false则表明这是一个“外源性(derived)”的属性,它的值来源于映射到同一个(或多个) 字段的某些其他属性,或者通过一个trigger(触发器)或其他程序生成。
⑤formula (可选):一个SQL表达式,定义了这个计算 (computed) 属性的值。计算属性没有和它对应的数据库字段。
⑥access (可选 - 默认值为property): Hibernate用来访问属性值的策略。
⑦lazy (可选 - 默认为 false):指定 指定实例变量第一次被访问时,这个属性是否延迟抓取(fetched lazily)( 需要运行时字节码增强)。
⑧unique (可选):使用DDL为该字段添加唯一的约束。 同样,允许它作为property-ref引用的目标。
⑨not-null (可选):使用DDL为该字段添加可否为空(nullability)的约束。
⑩optimistic-lock (可选 - 默认为 true):指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。 换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长。
⑪generated (可选 - 默认为 never): 表明此属性值是否实际上是由数据库生成的。
来看一下具体的实例吧:(User1.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">
<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>
三、数据库配置文件:(hibernate.cfg.xml)
先从一个例子开始介绍吧:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!--声明Hibernate配置文件的开始 -->
<hibernate-configuration>
<session-factory>
<!--设置数据库的连接驱动,URL(其中localhost表示mysql服务器名称,此处为本机,端口号+数据库名),用户名,密码, -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_basemapping</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- 配置属于MySQL的数据库语言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 调试时可打印出查询语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 对数据库表的具体 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 将实体映射关系xml配置进来 -->
<mapping resource="com/bjpowernode/hibernate/User1.hbm.xml" />
</session-factory>
</hibernate-configuration>
hibernate.hbm2ddl.auto具体解释如下:
①create-drop:
表示在hebarinate初始化时创建表格,程序运行结束的时候会删除相应的表格,在实际项目中不用
②create:
在hibernate初始化时会创建表格,在运行结束之后不删除表格,而是在下一次运行的时候如果有旧的删掉,没有旧的,重新建表格
③update:
只是根据映射文件去和数据库中的表对应起来,如果不一致,就更新表的结构
④validate:
校验映射文件和数据库中的表是不是能对应起来,不能对应报错,实际中常用
【小结】
以上就是Hibernate基础映射的相关知识和实践啦,你理解了多少?O(∩_∩)O下篇博客来介绍关系映射。