Facebook Twitter LinkedIn E-mail
magnify
Home Posts tagged "Hibernate"

Hibernate开发教程(2):准备开始

使用Hibernate开发应用,一种方法是下载Hibernate相关的jar文件,然后再项目在添加引用。由于Hibernate涉及的库比较多,这种方法比较麻烦,因此本教程使用Maven来管理项目。关于Maven的简单教程可以参见:

  1. Maven 使用指南(1): 概述
  2. Maven 使用指南(2): 第一个例子Hello World
  3. Maven 使用指南(3): 简述Maven工作过程
  4. Maven 使用指南(4): Maven Build 的阶段
  5. Maven 使用指南(5): Maven 自动依赖管理
  6. Maven 使用指南(6): 使用Maven插件
  7. Maven 使用指南(7): 使用Maven打包资源文件
  8. Maven 使用指南(8): 使用Maven管理多个项目

此外教程采用MySql 数据库为例,如果你使用Windows操作系统,可以安装WAMP系统(包括MySQL,Apache ,PHP等)也可以只安装MySQL。 Hibernate 使用其它数据库的方法大同小异。

管理MySQL的免费前端管理工具为HeidiSQL,你也可以使用命令行或是其它工具。

开始使用的示例数据库为Sales 数据库,可以参见Vaadin Web应用开发教程(46): 开始使用SQLContainer 。或是本地下载Sales.sql.

此外为方便起见 使用 Maven-Hibernate3插件,可以直接从数据库生成 映射文件和Java类代码。具体使用可以参见 Mojo。

开发环境使用Eclipse 或是 SpringSouce tool Suite (STS),这些都可以从网上免费下载。

首先创建一个Maven项目 HibernateTutorial.

修改pom.xml 添加于Hibernate相关的引用:

<dependencies>
	<dependency>
		<groupId>org.hibernate</groupId>
		<artifactId>hibernate-core</artifactId>
		<version>4.1.6.Final</version>
	</dependency>

	<!-- Hibernate uses jboss-logging for logging, for the tutorials we will
		use the sl4fj-simple backend -->
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-simple</artifactId>
		<version>1.6.1</version>
	</dependency>

	<!-- The tutorials use JUnit test cases to illustrate usage -->
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.10</version>
	</dependency>

	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.0.8</version>
	</dependency>
</dependencies>

使用Maven-Hibernate 的 hbm2java (自动生成Java代码),hbm2hbmxml (自动生成.hbm.xml 映射文件) 和 hbm2cfgxml (自动生成最终的hibernate.cfg.xml文件)

<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>hibernate3-maven-plugin</artifactId>
	<version>2.2</version>
	<configuration>
		<components>
			<component>
				<name>hbm2java</name>
				<outputDirectory>src/main/java/</outputDirectory>
				<implementation>jdbcconfiguration</implementation>
			</component>

			<component>
				<name>hbm2hbmxml</name>
				<outputDirectory>src/main/resources/</outputDirectory>
			</component>

			<component>
				<name>hbm2cfgxml</name>
				<outputDirectory>src/main/resources/</outputDirectory>
				<implementation>jdbcconfiguration</implementation>
			</component>
		</components>

		<componentProperties>
			<drop>true</drop>

			<configurationfile>/src/main/resources/hibernate.cfg.xml</configurationfile>
			<packagename>com.pstreets.hibernate.demo.data</packagename>
		</componentProperties>
	</configuration>
	<dependencies>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.0.8</version>
		</dependency>

	</dependencies>
</plugin>

其中hbm2java 通过 outputDirectory参数指明创建的Java代码的目录,hbm2hbmxml通过outputDirectory参数指明创建的映射文件的目录,本例使用缺省的资源目录src/main/resources ,因为我们使用MySQL plugin也添加了对mysql 的依赖。

hibernate.cfg.xml 为Hibernate的配置文件,本例使用如下配置来连接Mysql数据库的Sales数据库

<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.pool_size">1</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/Sales</property>
<property name="hibernate.connection.username">username</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>

在命令行运行 mvn hibernate3:hbm2java hibernate3:hbm2cfgxml hibernate3:hbm2hbmxml 自动生成java代码,.hbm.xml 映射文件及配置文件hibernate.cfg.xml。

到此时我们还没有写过一行代码。

下面我们就使用Hibernate 来读取Sales数据库的Customer表,并显示所有Customer的FirstName 和Last Name,代码如下:

SessionFactory sessionFactory;
sessionFactory = new Configuration().configure().buildSessionFactory();

// create a couple of events...
Session session = sessionFactory.openSession();
session.beginTransaction();

List result = session.createQuery( "from Customer" ).list();
for ( Customer customer : (List<Customer>) result ) {
	System.out.println( "Customer: " + customer.getFirstName()
	 + " " + customer.getLastName() );
}
session.getTransaction().commit();
session.close();

if (sessionFactory != null) {
	sessionFactory.close();
}

这里先不解释,但可以看出没有任何的SQL语句,就将Customer表的记录写到result 这个List对象中。结果如下:

Customer: Laura Steel
Customer: Susanne King
Customer: Anne Miller
Customer: Michael Clancy
Customer: Sylvia Ringer
Customer: Laura Miller
Customer: Laura White
Customer: James Peterson
Customer: Andrew Miller
Customer: James Schneider
Customer: Anne Fuller
Customer: Julia White
Customer: George Ott
Customer: Laura Ringer
Customer: Bill Karsen
Customer: Bill Clancy
Customer: John Fuller
Customer: Laura Ott
Customer: Sylvia Fuller
Customer: Susanne Heiniger
Customer: Janet Schneider
Customer: Julia Clancy
Customer: Bill Ott
Customer: Julia Heiniger
Customer: James Sommer
Customer: Sylvia Steel
Customer: James Clancy
Customer: Bob Sommer
Customer: Susanne White
Customer: Andrew Smith
Customer: Bill Sommer
Customer: Bob Ringer
Customer: Michael Ott
Customer: Mary King
Customer: Julia May
Customer: George Karsen
Customer: John Steel
Customer: Michael Clancy
Customer: Andrew Heiniger
Customer: Mary Karsen
Customer: Susanne Miller
Customer: Bill King
Customer: Robert Ott
Customer: Susanne Smith
Customer: Sylvia Ott
Customer: Janet May
Customer: Andrew May
Customer: Janet Fuller
Customer: Robert White
Customer: George Fuller

可以下载本例做为后续教程的基础。

 

Hibernate开发教程(1):概述

提起Hibernate,很多人多知道是一个ORM[Object-Relational-Mapping(对象-关系-映射]的中间件。它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来。无论是从设计草案还是从一个遗留数据库开始,开发人员都可以采用Hibernate。Hibernate不仅负责从Java类到数据库表的映射(还包括从Java数据类型到SQL数据类型的映射),还提供了面向对象的数据查询检索机制,从而极大地缩短的手动处理SQL和JDBC上的开发时间。
Hibernate 在.Net Framework 有对应的开发为NHibernate. Hibernate 和NHibernate 的基本概念和使用方法基本一致,因此本教程也可作为NHibernate开发的参考。

首先说明一下为什么要使用ORM工具,也就是使用类似hibernate 等ORM工具的好处。在软件开发的设计的过程,尤其是使用面向对象设计方法时,根据系统需求,抽象出系统对象模型(类定义),有了这些对象类定义,如果需要使用数据库存放这些数据,就需要根据系统需求和类定义来定义数据库的表,定义数据库表时有涉及到表和表之间的关系,表的主键和外键定义等等,然后再通过大量的SQL语句或是通过ADO对象来存取数据库,然后根据数控库内容创建或赋值对应的系统对象的实例。

在开发应用时,开发人员有相当一部分时间花在设计数据库表,表之间的关系,编写SQL语句,使用Hibernate之后,开发人员一般只需要对系统进行建模,抽象出系统的类定义,然后借助Object-Relational 映射文件(一般为XML文件),然后Hibernate就可以自动帮助用户创建数据表,通过简单的save, delete,load, update 等就可以完成数据库的存取操作,而无需再编写大量的SQL代码 ,大大提高软件的开发效率。

学习Hibernate 的一个核心问题为定义对象-关系-映射文件 (Object-Relational Mappings)。如果是开发新系统,有工具可以直接从UML生成Hibernate使用的映射文件。但如果是对现有系统进行改造或是数据库已经定义好,根据已有的系统类Classes 和Database Schema来定义Hibernate 映射文件就需要比较深入的了解Hibernate支持的映射关系类型(有点类似逆向工程,就比较费事)。

对于新建系统,Hibernate可以自动根据映射文件创建数据库Schema ,工作量就小多了,如果使用UML,连创建映射文件的工作都可以省了。

用个简单的例子来说明,比如使用SQL语句插入一条记录。

INSERT INTO Items(id, name) VALUES(NULL, 'My Item');

如果使用ORM框架,可以直接使用对象save方法

Item item = new Item();
item.name = "My Item";
item.save();

ORM框架自动根据所管理的数据创建对应的SQL语句对数据库进行读写操作。
后面就详细介绍Hibernate开发,数据使用常用的MySQL 数据库,Hibernate 支持大部分常用的数据库类型如Oracle, Mysql, Sqlite, SqlServer ,因此使用Hibernate的还有一个好处是通过了一个数据抽象层,可以屏蔽对实际物理数据库类型的依赖,支持无缝更换数据库类型:)(当然还是需要修改一些配置文件)。

 

HSQLDB 和 H2 数据库比较

前面在介绍Vaadin SQL Container时使用了HSQLDB ,也说过SQL Container在使用上并不十分方便,不如直接使用hibernate 来的实用,最近准备开始介绍hibernate 的开发指南,数据库系统也会使用H2 数据系统,和HSQLDB 一样,H2也是纯Java实现,对于使用hibernate 的应用来说,可以完全不考虑底层具体使用的是那种数据库,hibernate 框架提供了对物理数据库的抽象。下面表格给出了HSQLDB和H2数据直接的比较。

NOW COMPARING

HSQLDB

H2

RELATED DATABASE MANAGEMENT SYSTEMS:

HSQLDBSEE DETAILS › H2SEE DETAILS ›
SPECIFICATIONS
Product HSQLDB H2
Company HSQL Development H2 Software
Architecture Relational Model Relational Model
Software License
BSD
EPL
MPL
BSD
EPL
MPL
Operating System
BSD
Linux
Mac OS X
UNIX
Windows
z/OS
BSD
Linux
Mac OS X
UNIX
Windows
z/OS
Demo?
Interface
SQL
SQL
Website HSQLDB  (hsqldb.org) H2  (h2database.com)
First Public Release Year 2001 2005
Lastest Stable Version 2.2.6 1.3.163
Latest Release Year 2011 2011
PRICE
Price
$0
$0
GENERAL FEATURES
Features
ACID
Encryption of Data
Referential Integrity
Transactions
Unicode
XML Format Support
ACID
Encryption of Data
Referential Integrity
Transactions
Unicode
XML Format Support
Indexes
Full-text
Hash
None
Full-text
Hash
None
Database Capabilities
Blobs and Clobs
Common Table Expressions
Except
Inner Joins
Inner Selects
Intersect
Outer Joins
Parallel Query
Union
Windowing Functions
Blobs and Clobs
Common Table Expressions
Except
Inner Joins
Inner Selects
Intersect
Outer Joins
Parallel Query
Union
Windowing Functions
Partitioning
None
None
Access Control
Brute-force Protection
Native Network Encryption
Patch Access
Resource Limit
Run Unprivileged
Separation of Duties
Brute-force Protection
Native Network Encryption
Patch Access
Resource Limit
Run Unprivileged
Separation of Duties
Tables and Views
Temporary Table
Temporary Table
Other Objects
Data Domain
External Routine
Function
Procedure
Trigger
Data Domain
External Routine
Function
Procedure
Trigger
Support Features
FAQ
Forums
Mailing List
FAQ
Forums
Mailing List
PRODUCT DESCRIPTION
Product Description HSQLDB (HyperSQL DataBase) is the leading SQL relational database engine written in Java. It support… More H2 is a Java SQL database. The main features of H2 are:

  • Very fast, open source, JDBC API
  • Embedded and server modes; in-memory databases

… More

CONTACT INFORMATION
Contact Link Contact Link  (hsqldb.org)
Email dbsupport@h2database.com
LIMITS
Max Blob/Clob Size 64 TB 64 TB
Max CHAR Size Unlimited Unlimited
Max Column Name Size 128 Unlimited
Max Columns per Row Unlimited Unlimited
Max DATE Value 12/31/9999 99999999
Max DB Size 64 TB 64 TB
Max NUMBER Size Unlimited 64 bits
Max Row Size Unlimited Unlimited
Max Table Size Unlimited Unlimited
Min DATE Value 0001-01-01 -99999999
DATA TYPES
Type System
Static
Integer
BIGINT (64-bit)
INTEGER (32-bit)
SMALLINT (16-bit)
TINYINT (8-bit)
Floating Point
DOUBLE (64-bit)
Decimal
DECIMAL
NUMERIC
String
CHAR
CLOB
LONGVARCHAR
VARCHAR
CHAR
CLOB
LONGVARCHAR
VARCHAR
Binary
BINARY
LONGVARBINARY
VARBINARY
Date/Time
DATE
INTERVAL
TIME
TIMESTAMP
Boolean
BOOLEAN
Other
ARRAYS
BIT
BIT VARYING
More Details More Details