Hibernate 之 逐步介绍hello world示例

Hibernate由Gavin King于2001年启动,它是使用EJB2样式实体bean的替代方法。当时的任务是通过简化复杂性并允许缺少功能来提供比EJB2 更好的持久性功能。

Hibernate使用其映射文件和配置文件来实现其目标。随着JDK 1.5在Java社区中引入注解,Hibernate社区开始致力于支持注解的Hibernate 3。hibernate的当前版本是hibernate 5

在这个带有注解的 Hibernate 示例中,我们将学习有关 Hibernate 的更多信息,并逐步为初学者构建第一个正在运行的示例应用程序。

目录

什么是
Hibernate Hibernate的工作原理
Hibernate 与JPA的关系
Hibernate hello世界示例

什么是 Hibernate

Hibernate是Java的开源对象关系映射工具。它提供了一个框架,用于将面向对象的域模型映射到传统的关系数据库。Hibernate不仅负责从Java类到数据库表(以及从Java数据类型到SQL数据类型)的映射,而且还提供数据查询和检索功能,并且可以显着减少开发时间,否则将花费大量时间在SQL和JDBC中进行手动数据处理。

将Java类映射到数据库表是通过配置XML文件或使用Java 注解完成的。有一些设施可以安排一对多和类别之间的多对多关系。

除了管理对象之间的关联之外,Hibernate还可以管理自反关联,其中对象与自己类型的其他实例具有一对多关系。

Hibernate 如何运作

Hibernate 不会妨碍我们。也不会迫使我们改变对象的行为方式。对象无需实现任何魔术接口即可拥有持久的能力。我们要做的所有工作都是将一些元数据放入注解的形式,以告诉hibernate在与数据库映射它们时如何使用它们。在运行时,hibernate读取这些注解并使用此信息来构建查询以发送到某些关系数据库。

Hibernate中有一个简单直观的API,可以对数据库表示的对象执行查询,以更改我们通常在程序中与它们正常交互的那些对象,然后告诉Hibernate保存更改。创建新对象同样简单。我们只是以常规方式创建它们,并使用注解将它们告知Hibernate,以便它们可以存储到数据库中。

Hibernate 与JPA的关系

JPA(Java持久性API)是持久性提供程序要实现的规范。Hibernate就是这样的JPA规范的实现。我们可以使用JPA注解对注解进行尽可能多的注解,但是如果没有实现,将不会发生任何事情。

可以将JPA视为必须遵循的准则/规范或接口,而Hibernate JPA实现是符合JPA定义的API并提供底层功能的代码。

当我们将Hibernate与JPA结合使用时,实际上是在使用Hibernate JPA实现。这样做的好处是我们可以将JPA的 Hibernate 实现换成JPA规范的另一种实现。

当我们使用直接 Hibernate 时,由于其他ORM可能使用不同的方法/配置和注解,因此您将锁定到实现中,因此我们不能仅切换到另一个ORM。

Java Hibernate hello世界示例

让我们逐步创建一个 Hibernate 的hello世界示例。在这个例子中,我已经创建了一个Employee类,并宣布四个属性idemailfirstnamelastname

我希望id属性应自动生成,以便应用程序代码不存储员工ID的本地缓存。

到目前为止,我们的目标是要在第一个应用程序中进行制作。让我们确定需要创建的文件。

  1. hibernate.cfg.xml-此配置文件将用于存储数据库连接信息和架构级别设置。
  2. EmployeeEntity.java –此类将引用具有 Hibernate 注解的Java POJO。
  3. HibernateUtil.java –此类将具有实用程序方法,这些方法将用于创建会话工厂和会话对象。
  4. TestHibernate.java –此类将用于测试我们的配置设置和Emplyee实体注解。

在进入代码之前,让我们看一下项目的设置并添加maven依赖关系,这些依赖关系需要添加到其中,pom.xml以包括所有编译时间和运行时依赖关系。

1.创建一个Maven项目

mvn-create-java-project

2.使项目支持日食

在Maven项目中添加蚀支持

3.将Java项目导入到Eclipse工作区

在Eclipse中导入Java项目

以上步骤将创建最小设置。现在该添加 Hibernate 依赖项了。

4. Hibernate Maven依赖关系

<dependency>
	<groupid>org.hibernate</groupid>
	<artifactid>hibernate-commons-annotations</artifactid>
	<version>3.0.0.ga</version>
</dependency>
<dependency>
	<groupid>org.hibernate</groupid>
	<artifactid>hibernate-annotations</artifactid>
	<version>3.3.0.ga</version>
</dependency>
<dependency>
	<groupid>mysql</groupid>
	<artifactid>mysql-connector-java</artifactid>
	<version>5.1.6</version>
</dependency>
<dependency>
	<groupid>antlr</groupid>
	<artifactid>antlr</artifactid>
	<version>2.7.6</version>
</dependency>
<dependency>
	<groupid>commons-collections</groupid>
	<artifactid>commons-collections</artifactid>
	<version>3.1</version>
</dependency>
<dependency>
	<groupid>dom4j</groupid>
	<artifactid>dom4j</artifactid>
	<version>1.6.1</version>
</dependency>
<dependency>
	<groupid>javassist</groupid>
	<artifactid>javassist</artifactid>
	<version>3.4.GA</version>
</dependency>
<dependency>
	<groupid>javax.transaction</groupid>
	<artifactid>jta</artifactid>
	<version>1.1</version>
</dependency>
<dependency>
	<groupid>org.slf4j</groupid>
	<artifactid>slf4j-api</artifactid>
	<version>1.5.6</version>
</dependency>
<dependency>
	<groupid>org.slf4j</groupid>
	<artifactid>slf4j-log4j12</artifactid>
	<version>1.5.6</version>
</dependency>

请注意,在此 Hibernate 示例中,我们并没有使用所有的Maven依赖项,但是当我们开始扩展应用程序时将使用它们。

5. Hibernate 配置

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatetest</property>
        <property name="hibernate.connection.password">lg225295</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
		<property name="hbm2ddl.auto">update</property>
        <mapping class="hibernate.test.dto.EmployeeEntity"></mapping>
    </session-factory>
</hibernate-configuration>

运行此 Hibernate 示例之前,请不要忘记设置正确的密码。

6. Hibernate 实体类

package hibernate.test.dto;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

import org.hibernate.annotations.OptimisticLockType;

@Entity
@org.hibernate.annotations.Entity(optimisticLock = OptimisticLockType.ALL)
@Table(name = "Employee", uniqueConstraints = {
		@UniqueConstraint(columnNames = "ID"),
		@UniqueConstraint(columnNames = "EMAIL") })
public class EmployeeEntity implements Serializable {

	private static final long serialVersionUID = -1798070786993154676L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "ID", unique = true, nullable = false)
	private Integer employeeId;

	@Column(name = "EMAIL", unique = true, nullable = false, length = 100)
	private String email;

	@Column(name = "FIRST_NAME", unique = false, nullable = false, length = 100)
	private String firstName;

	@Column(name = "LAST_NAME", unique = false, nullable = false, length = 100)
	private String lastName;

	// Accessors and mutators for all four fields
}

7. Hibernate 会话工厂

package hibernate.test;

import java.io.File;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil 
{
	private static final SessionFactory sessionFactory = buildSessionFactory();

	private static SessionFactory buildSessionFactory() 
	{
		try {
			// Create the SessionFactory from hibernate.cfg.xml
			return new AnnotationConfiguration().configure(
					new File("hibernate.cgf.xml")).buildSessionFactory();

		} catch (Throwable ex) {
			// Make sure you log the exception, as it might be swallowed
			System.err.println("Initial SessionFactory creation failed." + ex);
			throw new ExceptionInInitializerError(ex);
		}
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public static void shutdown() {
		// Close caches and connection pools
		getSessionFactory().close();
	}
}

请不要忘记使用正确的路径hibernate.cgf.xml

8.演示

package hibernate.test;

import hibernate.test.dto.EmployeeEntity;
import org.hibernate.Session;

public class TestHibernate {

	public static void main(String[] args) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		session.beginTransaction();

		// Add new Employee object
		EmployeeEntity emp = new EmployeeEntity();
		emp.setEmail("demo-user@mail.com");
		emp.setFirstName("demo");
		emp.setLastName("user");

		session.save(emp);

		session.getTransaction().commit();
		HibernateUtil.shutdown();
	}
}

上面的代码将在数据库中创建一个新的表employee,并在此表中插入一行。在日志中,您可以验证已执行的插入语句。

Hibernate: insert into Employee (EMAIL, FIRST_NAME, LAST_NAME) values (?, ?, ?)

如果您在运行 Hibernate 的hello世界示例时遇到问题,请给我评论,我将很高兴与您讨论问题。

学习愉快!

参考文献:

Hibernate 首页

saigon has written 1440 articles

Leave a Reply