Hibernate学习——(一)简介、配置以及Annotation介绍

Struts2框架使得基于MVC架构的Web项目的开发变得快捷而稳健,然而,struts2框架和三层架构面对软件需求量越来越大的时

候,往往束手无策,程序员仍然需要在数据访问层编写大量重复性的代码。为了提高数据访问层的编码效率,诞生了当今较流行的

ORM(object relationship mapping对象-关系型数据映射)工具——Hibernate框架。ORM的思想就是将关系数据库中表中的记录映

射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。ORM采用元数据(描述数据的数据)来描述

对象-关系映射细节,元数据通常采用XML格式,且存放在专门的对象-关系映射文件中。

Hibernate框架有以下的优点:

1、Hibernate是JDBC的轻量级的对象封装,封装了通过JDBC访问数据库的操作,不必再去写面向过程的SQL语句。

2、Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的

Java程序,以及App Server没有任何关系,也不存在兼容性问题。

3、内存消耗少,可以获得较快的运行速度。

4、开发效率高,Eclipse等主流Java集成开发环境对Hiberna都有很好的支持。

5、分布式,安全简称,集群,负载均衡的支持。

6、具有扩展性,API扩展,当本身功能不够用时,可以自己编码进行扩展。


提到Hibernate不得不提到的就是JPA(Java Persistence API),JPA是Sun官方提出的Java持久化规范。它为Java开发

供了一种对象/关系映射工具来管理Java应用中的关系数据。而Hibernate是它的一种实现。除了Hibernate,还

EclipseLink(曾经的toplink),OpenJPA等可供选择,所以使用Jpa的一个好处是,可以更换实现而不必改动太多代

码。

//**********************************************************

Hibernate中,其综合了JPA的注解功能,并在其基础上进行了扩展。因此先在此把JPA的注解做一个记录:

1、@Entity(name="xxx")

必须,name为可选,标识这个POJO为一个JPA实体类,表明江北Hibernate持久化的Java对象。

使用XML文件的方法配置的话:

<hibernate-mapping package="">
    <class name="xxx">
    </class>
</hibernate-mapping>

2、@Table(name="")

必须,name为可选。映射成一张表,引导将数据固有化进入特定的数据库的表中。如果不定义@Table则默认的table

名和类名相同。不写参数默认表名跟类名相同。

使用XML文件的方法配置的话:

<hibernate-mapping package="">
    <class name="xxx" table="xxx">
    </class>
</hibernate-mapping>

3、@Id

必须,设置主键。一个实体类只能有一个主键,放置于getXxx()方法前。

使用XML文件的方法配置的话:

<hibernate-mapping package="">
    <class name="xxx" table="xxx">
       <!-- 其中name属性对应实体类的属性 -->
        <id name="xxx"></id>
    </class>
</hibernate-mapping>

4、@GeneratedValue(strategy="")

设置标识符的生成策略,常与@Id一起使用。

5、@Column

描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用。如果缺省,则默认

数据库表中字段名和属性名一致,否则可用name来设置。

name:表示数据库表中该字段的名称,默认情形属性名称一致 
nullable:表示该字段是否允许为null,默认为true 

unique:表示该字段是否是唯一标识,默认为false 
length:表示该字段的大小,仅对String类型的字段有效 
insertable:表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中,默认为true 
updateable:表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true.对于一经创建就不可以更改

的字段,该属性非常有用,如对于birthday字

columnDefinition: 表示该字段在数据库中的实际类型通常ORM框架可以根据属性类型自动判断数据库中字段的类型,是对于Date类型仍无法确定数据库中字段类型究竟是 DATE,TIME还是TIMESTAMP此外,String的默认映射类型为VARCHAR,如果要String类型映射到特定数据库的BLOB或 TEXT字段类型,该属性非常有用。

如果用XML文件的方法配置的话:

<hibernate-mapping package="">
    <class name="xxx" table="xxx">
        <id name="xxx">
            <column name="xxx" />
        </id>
    </class>
</hibernate-mapping>

6、@Transient

表示该属性并非一个到数据库表的字段的映射,ORM框架将自动忽略该属性,如果不标注,则会自动将它视@Basic。

如果用XML文件的方法设置的话:直接不写这个property即可。

7、@Basic

表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getXxx()方法,即默认为@Basic

fetch:表示该属性的读取策略,有EAGER和LAZY两种,分别表示主支抓取和延迟加载,默认为EAGER。

optional:表示该属性是否允许位NUll,默认为true。

如果用XML文件的方法设置的话:利用property标签。同样有name属性以及内部的column标签。

<hibernate-mapping package="">
    <class name="xxx" table="xxx">
        <id name="xxx"></id>
        <property name="xxx" />
    </class>
</hibernate-mapping>

8、@Temporal

和时间有关,设置了持久化时间数据的精度问题。有三个基本参数TIMESTAMP(默认),DATE,TIME。

如果用XML文件的方法设置的话:

<hibernate-mapping package="">
    <class name="xxx" table="xxx">
        <id name="xxx"></id>
        <property name="date" type="time|date|timestamp"/>
    </class>
</hibernate-mapping>
顺便说一下,标签体中的type属性,表示的是该属性的java类型,大部分时间是不用去更改的。


...后续有学习到的注解再补上。


现在Hibernate4及以上版本获得了很高的普及,因此本次学习都针对Hibernate4以后的版本进行学习。Hibernate的搭建可以通

过Xml来搭建,也可以利用annotation来搭建从而简化过程。在Hibernate4之前,如果要使用annotation来进行搭建需要添加其他的

jar包,但是在Hibernate4及以后本身的required包就包含了对annotation的支持,因此以后也长期采用annotation的方法来搭建,所

以在此只介绍annotation的方法。【采用MyEclipse作为开发平台】

static {
		Configuration cfg = new Configuration();  	//创建Configuration实例,以读取并解析配置文件(hibernate.cfg.xml),
		cfg.configure();				//一个Configuration实例代表hibernate所有的Java类到Sql数据库映射的集合。
	}		

	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		Session s = HibernateSessionFactory.getSession();//用缓存中含有Configuration配置信息的SessionFactory提供连接
		Transaction tran = s.beginTransaction();	//开始一个事务
		s.save(this.manager);
		tran.commit();				<span style="white-space:pre">	</span>//提交事务
		s.close();					//关闭session
		errormessage = "添加成功。";
		return SUCCESS;
	}
上面代码片段是截取我的一个Web项目的action片段。和Hibernate4环境搭建有关的语句已经注释。

之后,在相关Dao类里面,做@标记。

package cn.wqy.dao;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="manager_backup")
public class Manager {
	private int manager_id;
	private String manager_name;
	private String manager_password;

	@Id
	public int getManager_id() {
		return manager_id;
	}

	public void setManager_id(int manager_id) {
		this.manager_id = manager_id;
	}

	public String getManager_name() {
		return manager_name;
	}

	public void setManager_name(String manager_name) {
		this.manager_name = manager_name;
	}

	public String getManager_password() {
		return manager_password;
	}

	public void setManager_password(String manager_password) {
		this.manager_password = manager_password;
	}

}

之后需要添加Hibernate.cfg.xml,做配置文件。

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>

<session-factory>
<!-- 指定数据库使用的SQL方言 -->
	<property name="dialect">
		org.hibernate.dialect.MySQLDialect
	</property>
	<!-- 指定数据库的相关基本信息 -->
	<property name="connection.url">
		jdbc:mysql://localhost:3306/student_management?useUnicode=true&characterEncoding=UTF8
	</property>
	<property name="connection.username">root</property>
	<property name="connection.password">wangqy</property>
	<property name="connection.driver_class">
		com.mysql.jdbc.Driver
	</property>
	<property name="myeclipse.connection.profile">MySQL</property>
	<!-- 指定运行时是否在控制台输出SQL语句 -->
	<property name="show_sql">true</property>
	<!-- 指定运行时是否对打印出的SQL的语句进行格式化(多行打印) -->
	<property name="format_sql">true</property>
	<!-- 指定当表不存在时自动建表 -->
	<property name="hbm2ddl.auto">update</property>
	<mapping class="cn.wqy.dao.Manager" />
</session-factory>

</hibernate-configuration>
里面包含了关于Hibernate的一些配置,包括数据库连接的信息等等。

Ps:如果采用XML的方式进行配置,则还需要配置映射文件,里面添加了对表和Java持久化类的映射关系的说明。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate_mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="持久化类全名" table="数据库表名" >
	<id name="id">
		<generator class="native"/>
		<column name="字段名" />
	</id>
	<property name="Java持久化类属性名" type="date" not-null="true" update="false">
		<column name="字段名" />
	</property>
	...
</class>
</hibernate-mapping


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值