`

第一个Hibernate实例

阅读更多

本人采用hibernate3.2.5和hibernate3.3.1来作为学习的版本。

1.到hibernate官网http://www.hibernate.org上下载您需要的版本。本人下载了hibernate3.2.5和hibernate3.3.1两个版本。
2.将下载目录/hibernate3.jar和/lib下的hibernate运行时必须的包加入classpath中:
    antlr.jar,cglib.jar,asm.jar,commons-collections.jar,commons-logging.jar,jta.jar,dom4j.jar。
    当然,为了方便也可以直接把/lib目录下的所有jar一次性导入classpath下即可。

3. 将你要连接的具体数据库的驱动类jar包加入到classpath中。

4. 建立实体类:

我的实体类创建如下所示:

package com.reiyen.hibernate.domain;

import java.util.Date;
public class User {
	
	private int id;
	private String name;
	private Date birthday;
	
    public int getId() {
    	return id;
    }
	
    public void setId(int id) {
    	this.id = id;
    }
	
    public String getName() {
    	return name;
    }
	
    public void setName(String name) {
    	this.name = name;
    }
	
    public Date getBirthday() {
    	return birthday;
    }
	
    public void setBirthday(Date birthday) {
    	this.birthday = birthday;
    }
}

 5. 建立实体类与数据库表的映射关系(ORMapping)User.hbm.xml,将此配置文件置于与你创建的实体类的同一个包中,而不是直接放在classpath下面:

User.hbm.xml映射文件配置如下:(如果是在Oracle数据库中运行,此配置文件必须修改,改成<class name="User" table="test_user">即可,因为user在oracle数据库中是数据库关键字。如果表名一定是叫user的话,可以进行如下处理:table="`user`",给user加上反引号,告诉数据库将它当作一个普通的字符串来处理,而不是当作关键字来处理(如:定单order,它就是一个数据库关键字,所以必须处理,table="orders")。如果你的实体类中有其他的属性名(如:date)与数据库中的关键字冲突,你都可以修改它在数据库中映射的字段名或加反引号解决。)

<?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.reiyen.hibernate.domain">
<!--用class元素来定义一个持久化类 -->
	<class name="User" >
		<id name="id" >
			<generator class="native" />
		</id>
		<property name="name" />
		<property name="birthday" />
	</class>
</hibernate-mapping>

 6.将你的配置文件hibernate.cfg.xml和hibernate.properties中的任一一个加入到classpath下(配置文件有xml和properites两种),    这两个文件的作用是一样的,提供一个即可(如果两个配置文件都有的情况下,XML配置文件会覆盖掉properites文件中的属性,因为XML文件中的属性信息反馈级高于properties中的属性)。(这里需要注意一点:

一般在实际应用中,你的hibernate.cfg.xml配置文件并没有直接像导入jar包一样导入到classpath下,而只要放到你的Eclipse建立的工程的src目录下即可,hibernate就能自动找到。这是为什么呢?因为src目录确实不在classpath下面,但因为你的项目进行编译时,Eclipse会将你的源文件编译后存在一个叫bin的目录下,同时你的配置文件也相应的复制过去了,而这个bin目录属于classpath的一部分,所以Hibernat就能自动找到你的配置文件了。你可以打开你的工程下的.classpath文件,里面有一行:<classpathentry kind="output" path="bin"/>。你也可以把bin目录下的hibernate.cfg.xml文件删除然后再运行一下原来的程序,它会抛出如下 的一个异常:Caused by: org.hibernate.HibernateException: /hibernate.cfg.xml not found。如果你的工程是Web工程,则配置文件会复制到WebRoot/WEB-INF/classes下面去。同时在你的.classpath文件下有一行:<classpathentry kind="output" path="WebRoot/WEB-INF/classes"/>)。同时将你的映射配置文件User.hbm.xml在此配置文件中注册。推荐xml格式的文件。下载目录/etc(版本hibernate3.2.5)或下载目录/project/etc(版本hibernate3.3.1)下是示例配置文件。
    可以在配置文件中指定:
    数据库的URL、用户名、密码、JDBC驱动类、方言等。
    程序启动时,hibernate会在CLASSPATH下寻找这个配置文件。当然这个文件你也可以不放在CLASSPATH下,这在以后再详细说明。

我的配置文件hibernate.cfg.xml(当然名字也可以取成其他名字,这也这以后详解)如下所示:

 

<!--表明解析本XML文件的DTD文档位置,DTD是Document Type Definition 的缩写,即文档类型的定义,XML解析器使用DTD文档来检查XML文件的合法性。hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以在 Hibernate3.2.5软件包中的src\org\hibernate目录中找到此文件-->
<!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配置的,SessionFactory是Hibernate中的一个类,这个类主要负责保存HIbernate的配置信息,以及对Session的操作-->
	<session-factory>
		<!--配置数据库的驱动程序,Hibernate在连接数据库时,需要用到数据库的驱动程序-->
		<property name="hibernate.connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		<!--设置数据库的连接url:jdbc:mysql://localhost:port/test,其中localhost表示mysql服务器名称,此处为本机。port代表mysql服务器的端口号,默认是3306。test是数据库名,这是你要连接的数据库名-->
		<property name="hibernate.connection.url">
			jdbc:mysql://localhost:3306/test
		</property>
		<!--如果你的mysql服务器都是默认设置的,且装在本机器上,则也可以写成
			property name="hibernate.connection.url">
			jdbc:mysql://localhost/test
			</property>或
			<property name="hibernate.connection.url">
			jdbc:mysql:///test
			</property>
		-->
		<!--连接数据库的用户名-->
		<property name="hibernate.connection.username">root</property>
		<!--连接数据库的密码-->
		<property name="hibernate.connection.password"></property>
		<!--hibernate.dialect 是Hibernate使用的数据库方言,就是要用Hibernate连接哪种类型的数据库服务器。-->
		<property name="dialect">
			org.hibernate.dialect.MySQLDialect
		</property>

<!--hibernate.hbm2ddl
.auto
指定由java代码生成数据库脚本,进而生成具体的表结构的具体方式	-->	
<property name="hbm2ddl.auto">update</property>
		<!--是否在后台显示Hibernate生成的查询数据库的SQL语句,开发时设置为true,便于查询错误,程序运行时可以在Eclipse的控制台显示Hibernate执行的Sql语句。项目部署后可以设置为false,提高运行效率-->
		<property name="show_sql">true</property>
	<!--指定映射文件为"com/reiyen/hibernate/domain/User.hbm.xml"-->           
		<mapping resource="com/reiyen/hibernate/domain/User.hbm.xml" />
	</session-factory>
</hibernate-configuration>

7.用JUnit对第一个hibernate实例进行测试(即在eclipse中创建一个junit.test.case,然后导入junit jar包):

测试代码如下:

public class TestUser {

	@Test
	public void test1(){
		Configuration config = new Configuration();
		config.configure();
             // 如果hibernate.cfg.xml中没有配置的某些属性,你可以通过config.setProperty(propertyName, value);来配置.
        //如config.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
		SessionFactory factory = config.buildSessionFactory();
	
		Session session = factory.openSession();
                Transaction tran = session.beginTransaction();
		User user = new User();
		user.setBirthday(new Date());
		user.setName("xxlong1");
		session.save(user);
               //session.persist(user);
		tran.commit();
		session.close();	}
}
 

测试结果显示是绿条,说明测试成功。然后进入我的mysql的test数据库中发现创建了一个新的user表,且表中有了一条新记录!在测试时一定要记得开启事务,否则,虽然会在你的Eclipse控制台打印出Hibernate: insert into User (name, birthday) values (?, ?), junit测试结果报告也是绿条,但在数据库里面是没有相应的记录的。因为你未开启事务,数据插入数据库里面后,在Session关闭前它一直没有等到commit命令,所以在Session关闭时,记录又被rollback了。这就是你在控制台能看到hibernate打印出insert into语句,但数据库里却没有相应记录的原因。在测试时,保存对象时也可以用persist方法。使用此方法时,如果未开启事务,测试报告也会是绿条,但同样也不会在数据库里面是没有相应的记录的。但和save方法的区别是,你在控制台也看不到hibernate产生的insert into语句,这就说明在未开启事务时,persist方法压根就不会往数据库里面插入数据。

注意:1.一定要记得加入具体数据库的驱动jar包,否则会出现JDBC Driver class not found的异常!

          2. 一定要记隹在hibernate配置文件hibernate.cfg.xml中注册你的映射文件

<!--指定映射文件为"com/reiyen/hibernate/domain/User.hbm.xml"-->           
		<mapping resource="com/reiyen/hibernate/domain/User.hbm.xml" />

否则会出现异常:org.hibernate.MappingException: Unknown entity: com.reiyen.hibernate.domain.User
        3.保证你的mysql中存在名为test的数据库。

        4.为了能让hibernate在数据库中自动创建表,配置文件hibernate.cfg.xml中项:hbm2ddl.auto这一项不能少:

<!--hibernate.hbm2ddl.auto指定由java代码生成数据库脚本,进而生成具体的表结构的具体方式	-->	
<property name="hbm2ddl.auto">update</property>


"hibernate.hbm2ddl .auto "包含以下四个属性:(http://www.jroller.com/eyallupu/entry/hibernate_s_hbm2ddl_tool有详细的说明)

  • create-drop : 会根据你的实体类来生成表。但是hibernate每次初始化时都会删除掉上一次的所有表,再重新生成表,即使这两次的表结构没有任何改变,但虚拟机退出时(即Web程序服务器关闭,应用程序运行结束时)又会删除此次所创建的表。
  • create : 会根据你的实体类来生成表。但是hibernate每次初始化时都会删除掉上一次的所有表,再重新生成表,即使这两次的表结构没有任何改变,但虚拟机退出时(即Web程序服务器关闭,应用程序运行结束时)不会删除此次所创建的表。
  • update : 最常用的属性,会根据你的实体类来生成表,即使表结构改变了,表中的行仍然存在,不会删除以前的行,只会更新表结构。
  • validate : 只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

 

9
0
分享到:
评论

相关推荐

    hibernate的第一个例子

    这是hibernate 的超级简单的例子,只有一个持久化对象和一个辅助类,还有一个测试类,对于初学者很有参考价值

    hibernate入门--第一个实例

    hibernate 入门详细操作步骤 包括hibernate包,实例实现文档····

    Hibernate实践例子程序

    Hibernate 是一个开源的O/R mappimg的框架,基于JDBC...另外还有两个东东,一个是class2hbm,与第一个相反,是根据class来导出映射文件的。还有一个ddl2hbm,是根据数据库来导出表结构,并生成映射文件和POJO class。

    hibernate 实例二

    这是初学hibernate的第二个例子,如实例一,新建一个数据库,接着配置即可。

    struts+spring+hibernate 实例

    第一次做SSH,中间发现了很多的问题,经过调试,总算可以正常运行别往数据库中添加数据了。 将此工程做了记录,现发布于此,大家共享

    Hibernate Web应用的开发步骤

    Hibernate Web应用的开发一般经过以下几个步骤: (1)创建数据库。 (2)将Hibernate所需的JAR包复制到WEB-INF/lib下。 (3)创建Hibernate的配置文件。 (4)利用Hibernate的第三方工具或Eclipse的有关插件从...

    Hibernate3.1_学习源码

    实体层设计:与第一种方法设计一样,设计三个实体类,分父类和子类 配置文件:依然只配置父类的映射文件,加入discriminator和subclass元素加入子类的映射关系 06 06Hibernate_Collection : Hibernate的容器映射...

    Java Web开发实例大全

    Java Web开发实例大全(提高卷)筛选、汇集了Java Web开发从基础知识到高级应用各个层面的大量实例及源代码,共有600个左右,每个实例及源代码按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析...

    Hibernate+中文文档

    1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. ...

    (3.0版本)自己写的struts2+hibernate+spring实例

    主要是针对写了第二个版本之后的一些问题做一些回答才做得第三个版本.中间加一些小技巧之类的.不过我觉得还是值得一些关注的朋友期待的. 如果没有意外.这个版本应该是一个定型的版本了.在这段期间.有很多朋友问...

    Hibernate实战(第2版 中文高清版)

    第一部分 从Hibernate和EJB 3.0开始  第1章 理解对象/关系持久化   1.1 什么是持久化   1.1.1 关系数据库   1.1.2 理解SQL   1.1.3 在Java中使用SQL   1.1.4 面向对象应用程序中的持久化   1.2 范式不...

    Hibernate中文API

    1.2. 第一部分 - 第一个Hibernate应用程序 首先我们将创建一个简单的基于控制台的(console-based)Hibernate应用程序。由于我们使用Java数据库(HSQL DB),所以不必安装任何数据库服务器。 假设我们希望有一个小...

    HibernateAPI中文版.chm

    1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. ...

    hibernate3.2中文文档(chm格式)

    1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. ...

    Struts+Hibernate+Spring整合分页实例(带排序功能)part1

    这是Java常用框架阶段在为学生答疑时做的一个SSH整合分页实例(第一部分),涉及了SSH整合、日期模糊查询、查询条件绑定、查询结果排序等功能,希望能为大家提供一些思路。 分页是绝大多数MIS系统必需的功能之一,...

    第24次课-1 Spring与Hibernate的整合

    第24次课-1 Spring与Hibernate的整合 本节主要内容 24.1 概述 24.2 管理SessionFactory 24.3 Spring对Hibernate的简化 24.1 概述 24.1.1 概述 Spring提供了很多IoC特性的支持,方便处理大部分典型的Hibernate整合...

    精通JAVA Web整合开发jsp+ajax+struts+hibernate第15章 综合实例:电子商城系统源码

    精通JAVA Web整合开发jsp+ajax+struts+hibernate 第15章 综合实例:电子商城系统源码 无法全部上传,太大了,所以就把最重要的一章源代码先上传了,其他的有再上传。在MyEclipse中可以运行的

    Hibernate中文详细学习文档

    1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. ...

    hibernate+中文api

    1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. ...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    第3章 第一个Hibernate应用 47 本章通过简单的helloapp应用例子,演示如何利用Hibernate来持久化Java对象。 3.1 创建Hibernate的配置文件 47 3.2 创建持久化类 48 3.3 创建数据库Schema 51 3.4 创建对象-关系...

Global site tag (gtag.js) - Google Analytics