Hibernate 入門教程

歡迎來到Hibernate入門教程。Hibernate是最廣泛使用的Java ORM工具之一。大多數應用程序使用關聯數據庫來存儲應用程序信息,在低級別上我們使用JDBC API來連接數據庫並執行CRUD操作。

Hibernate入門教程

如果您查看JDBC代碼,會發現有很多樣板代碼,並且有可能發生資源洩漏和數據不一致的情況,因為所有的工作都需要由開發人員完成。這就是ORM工具派上用場的地方。對象關聯映射或ORM是一種將應用程序領域模型對象映射到關聯數據庫表的編程技術。Hibernate是一個基於Java的ORM工具,提供了將應用程序領域對象與關聯數據庫表相互映射的框架。使用Hibernate作為ORM工具的一些好處包括:

  1. Hibernate支持將Java類映射到數據庫表,反之亦然。它提供了在所有主要關聯數據庫之間執行CRUD操作的功能。
  2. Hibernate消除了使用JDBC時帶來的所有樣板代碼,並且負責管理資源,因此我們可以專注於業務用例,而不是確保資料庫操作不會造成資源洩漏。
  3. Hibernate支援交易管理,並確保系統中不存在不一致的資料。
  4. 由於我們使用XML、屬性文件或註釋將Java類映射到數據庫表,它在應用程序和數據庫之間提供了一個抽象層。
  5. Hibernate幫助我們映射連接、集合、繼承對象,我們可以輕鬆地看到我們的模型類如何表示數據庫表。
  6. Hibernate提供了一個強大的查詢語言(HQL),它類似於SQL。但是,HQL是完全面向對象的,並且了解繼承、多態性和關聯等概念。
  7. Hibernate還提供與一些外部模塊的集成。例如,Hibernate Validator是Bean Validation(JSR 303)的參考實現。
  8. Hibernate是來自紅帽社區的開源項目,並且被全球廣泛使用。這使它比其他選擇更好,因為學習曲線較小,並且在論壇中有大量的在線文檔和幫助資源。
  9. Hibernate易於與其他Java EE框架集成,它如此受歡迎,以至於Spring框架為將Hibernate與Spring應用程序集成提供了內置支援。

I hope all the above benefits will convince you that Hibernate is the best choice for your application object-relational mapping requirements. Let’s look at the Hibernate Framework architecture now and then we will jump into sample project where we will look into different ways to configure Hibernate in standalone java application and use it.

Hibernate 架構

下圖顯示了 Hibernate 架構以及它作為應用程式類別和 JDBC/JTA API 之間的抽象層如何運作。很明顯,Hibernate 是建立在 JDBC 和 JTA API 之上的。現在讓我們一一看看 Hibernate 架構的核心元件。

  • SessionFactory (org.hibernate.SessionFactory):SessionFactory 是一個不可變的、線程安全的緩存,用於單個資料庫的編譯映射。我們可以使用 SessionFactory 獲取 org.hibernate.Session 的實例。
  • Session (org.hibernate.Session):Session 是一個單線程的、短暫的物件,代表應用程式與持久性存儲之間的對話。它封裝了 JDBC 的 java.sql.Connection,並且可以用來創建 org.hibernate.Transaction
  • 持久化物件:持久化物件是短暫的、單線程的物件,包含持久狀態和業務功能。它們可以是普通的 JavaBeans/POJOs。它們與一個 org.hibernate.Session 相關聯。
  • 短暂对象:短暂对象是持久化类的实例,目前尚未与org.hibernate.Session相关联。它们可能由应用程序实例化但尚未持久化,或者可能由已关闭的org.hibernate.Session实例化。
  • 事务(org.hibernate.Transaction):事务是应用程序用于指定原子工作单元的单线程、短暂对象。它将应用程序与底层的JDBC或JTA事务隔离开来。在某些情况下,一个org.hibernate.Session可能跨越多个org.hibernate.Transaction
  • 连接提供程序(org.hibernate.connection.ConnectionProvider):连接提供程序是用于创建JDBC连接的工厂。它在应用程序和底层的javax.sql.DataSourcejava.sql.DriverManager之间提供了抽象。它对应用程序不可见,但可以由开发人员扩展。
  • 事务工厂(org.hibernate.TransactionFactory):用于创建org.hibernate.Transaction实例的工厂。

Hibernate和Java持久化API(JPA)

Hibernate提供了Java持久化API的实现,因此我们可以在模型Bean中使用JPA注解,而Hibernate将负责配置它以用于CRUD操作。我们将通过注解示例来了解这个问题。

Hibernate示例

在开发Hibernate应用程序时,我们需要提供两组配置。第一组配置包含特定于数据库的属性,这些属性将用于创建数据库连接和会话对象。第二组配置包含模型类和数据库表之间的映射。我们可以使用基于XML或基于属性的配置来进行与数据库连接相关的配置。我们可以使用基于XML或基于注解的配置来提供模型类和数据库表的映射。我们将使用javax.persistence中的JPA注解来进行基于注解的映射。我们的最终项目将如下图所示。在Eclipse或您喜欢的IDE中创建一个Maven项目,您可以选择任何名称。在我们进入项目的不同组件之前,我们需要进行数据库设置。

資料庫表格設置

在我的例子中,我使用MySQL資料庫,下面的腳本用於創建必要的表格。

CREATE TABLE `Employee` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `role` varchar(20) DEFAULT NULL,
  `insert_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;

請注意,Employee表格的”id”列是由MySQL自動生成的,所以我們不需要插入它。

Hibernate專案相依性

我們最終的pom.xml文件如下所示。

<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.journaldev.hibernate</groupId>
  <artifactId>HibernateExample</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>HibernateExample</name>
  
  <dependencies>
  	<dependency>
  		<groupId>org.hibernate</groupId>
  		<artifactId>hibernate-core</artifactId>
  		<version>4.3.5.Final</version>
  	</dependency>
  	<!-- Hibernate 4 uses Jboss logging, but older versions slf4j for logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
        	<groupId>mysql</groupId>
        	<artifactId>mysql-connector-java</artifactId>
        	<version>5.0.5</version>
        </dependency>
  </dependencies>
  
  <build>
  	<finalName>${project.artifactId}</finalName>
  </build>
</project>

hibernate-core組件包含了所有核心的Hibernate類,所以通過將其包含在項目中,我們將獲得所有必要的功能。請注意,我在我的示例項目中使用了最新的Hibernate版本(4.3.5.Final),Hibernate仍在不斷發展,我注意到每個主要版本之間許多核心類發生了變化。所以,如果您使用的是其他版本,有很小的機會需要修改Hibernate的配置才能正常工作。但是,我確信它對於所有4.x.x版本都可以正常工作。Hibernate 4使用JBoss日誌,但舊版本使用slf4j進行日誌記錄,所以我在我的項目中包含了slf4j-simple組件,雖然不需要,因為我使用的是Hibernate 4。mysql-connector-java是用於連接到MySQL資料庫的MySQL驅動程式,如果您使用其他資料庫,請添加相應的驅動程式組件。

域模型类

如您在上面的圖像中所看到的,我們有兩個模型類:Employee和Employee1。Employee是一個簡單的Java Bean類,我們將使用基於XML的配置來提供其映射細節。Employee1是一個Java Bean,其中的字段帶有JPA註解,因此我們不需要在單獨的XML文件中提供映射。

package com.journaldev.hibernate.model;

import java.util.Date;

public class Employee {

	private int id;
	private String name;
	private String role;
	private Date insertTime;
	
	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 String getRole() {
		return role;
	}
	public void setRole(String role) {
		this.role = role;
	}
	public Date getInsertTime() {
		return insertTime;
	}
	public void setInsertTime(Date insertTime) {
		this.insertTime = insertTime;
	}
	
}

Employee類是一個簡單的Java Bean,這裡沒有什麼特別需要討論的。

package com.journaldev.hibernate.model;

import java.util.Date;

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;

@Entity
@Table(name="Employee", 
	   uniqueConstraints={@UniqueConstraint(columnNames={"ID"})})
public class Employee1 {

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="ID", nullable=false, unique=true, length=11)
	private int id;
	
	@Column(name="NAME", length=20, nullable=true)
	private String name;
	
	@Column(name="ROLE", length=20, nullable=true)
	private String role;
	
	@Column(name="insert_time", nullable=true)
	private Date insertTime;
	
	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 String getRole() {
		return role;
	}
	public void setRole(String role) {
		this.role = role;
	}
	public Date getInsertTime() {
		return insertTime;
	}
	public void setInsertTime(Date insertTime) {
		this.insertTime = insertTime;
	}
}

javax.persistence.Entity註解用於將類標記為可以由Hibernate持久化的實體Bean,因為Hibernate提供了JPA實現。javax.persistence.Table註解用於定義表映射和列的唯一約束。javax.persistence.Id註解用於定義表的主鍵。javax.persistence.GeneratedValue用於定義該字段將自動生成,並且使用GenerationType.IDENTITY策略,以便將生成的”id”值映射到Bean並可以在Java程序中檢索。javax.persistence.Column用於將字段映射到表列,我們還可以為Bean屬性指定長度、可為空性和唯一性。

Hibernate映射XML配置

如上所述,我们将使用基于XML的配置来进行Employee类的映射。我们可以选择任何名称,但为了清晰起见,最好选择与表格或Java Bean名称相符的名称。我们的Employee Bean的Hibernate映射文件如下所示。employee.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"https://hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="com.journaldev.hibernate.model.Employee" table="EMPLOYEE">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="role" type="java.lang.String">
            <column name="ROLE" />
        </property>
        <property name="insertTime" type="timestamp">
        	<column name="insert_time" />
        </property>
    </class>
</hibernate-mapping>

XML配置很简单,与注解配置实现的功能相同。

Hibernate配置文件

我们将创建两个Hibernate配置XML文件-一个用于基于XML的配置,另一个用于注解配置。hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"https://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- Database connection properties - Driver, URL, user, password -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost/TestDB</property>
		<property name="hibernate.connection.username">pankaj</property>
		<property name="hibernate.connection.password">pankaj123</property>
		<!-- Connection Pool Size -->
		<property name="hibernate.connection.pool_size">1</property>
		
		<!-- org.hibernate.HibernateException: No CurrentSessionContext configured! -->
		<property name="hibernate.current_session_context_class">thread</property>
		
		<!-- Outputs the SQL queries, should be disabled in Production -->
		<property name="hibernate.show_sql">true</property>
		
		<!-- Dialect is required to let Hibernate know the Database Type, MySQL, Oracle etc
			Hibernate 4 automatically figure out Dialect from Database Connection Metadata -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 

		<!-- mapping file, we can use Bean annotations too --> 
		<mapping resource="employee.hbm.xml" />
	</session-factory>
</hibernate-configuration>

大多数属性与数据库配置相关,其他属性的详细信息在注释中给出。请注意Hibernate映射文件的配置,我们可以定义多个Hibernate映射文件并在此处进行配置。还请注意,映射是特定于会话工厂的。hibernate-annotation.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"https://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- Database connection properties - Driver, URL, user, password -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost/TestDB</property>
		<property name="hibernate.connection.username">pankaj</property>
		<property name="hibernate.connection.password">pankaj123</property>
		
		<!-- org.hibernate.HibernateException: No CurrentSessionContext configured! -->
		<property name="hibernate.current_session_context_class">thread</property>
		
		<!-- Mapping with model class containing annotations -->
		<mapping class="com.journaldev.hibernate.model.Employee1"/>
	</session-factory>
</hibernate-configuration>

大部分配置与基于XML的配置相同,唯一的区别是映射配置。我们可以为类和包提供映射配置。

Hibernate SessionFactory

I have created a utility class where I am creating SessionFactory from XML based configuration as well as property based configuration. For property based configuration, we could have a property file and read it in the class, but for simplicity I am creating Properties instance in the class itself.

package com.journaldev.hibernate.util;

import java.util.Properties;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

import com.journaldev.hibernate.model.Employee1;

public class HibernateUtil {

	//基於XML的配置
	private static SessionFactory sessionFactory;
	
	//基於注釋的配置
	private static SessionFactory sessionAnnotationFactory;
	
	//基於屬性的配置
	private static SessionFactory sessionJavaConfigFactory;

    private static SessionFactory buildSessionFactory() {
        try {
            //從hibernate.cfg.xml中創建SessionFactory
        	Configuration configuration = new Configuration();
        	configuration.configure("hibernate.cfg.xml");
        	System.out.println("Hibernate Configuration loaded");
        	
        	ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        	System.out.println("Hibernate serviceRegistry created");
        	
        	SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        	
            return sessionFactory;
        }
        catch (Throwable ex) {
            //確保記錄異常,因為它可能被忽略
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    private static SessionFactory buildSessionAnnotationFactory() {
    	try {
            //從hibernate.cfg.xml中創建SessionFactory
        	Configuration configuration = new Configuration();
        	configuration.configure("hibernate-annotation.cfg.xml");
        	System.out.println("Hibernate Annotation Configuration loaded");
        	
        	ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        	System.out.println("Hibernate Annotation serviceRegistry created");
        	
        	SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        	
            return sessionFactory;
        }
        catch (Throwable ex) {
            //確保記錄異常,因為它可能被忽略
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
	}

    private static SessionFactory buildSessionJavaConfigFactory() {
    	try {
    	Configuration configuration = new Configuration();
		
		//創建Properties,也可以從屬性文件中讀取
		Properties props = new Properties();
		props.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
		props.put("hibernate.connection.url", "jdbc:mysql://localhost/TestDB");
		props.put("hibernate.connection.username", "pankaj");
		props.put("hibernate.connection.password", "pankaj123");
		props.put("hibernate.current_session_context_class", "thread");
		
		configuration.setProperties(props);
		
		//我們可以使用映射文件或帶有注釋的類
		//addClass(Employee1.class)將查找資源
		//com/journaldev/hibernate/model/Employee1.hbm.xml(不好)
		configuration.addAnnotatedClass(Employee1.class);
		
		ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
    	System.out.println("Hibernate Java Config serviceRegistry created");
    	
    	SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    	
        return sessionFactory;
    	}
        catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
	}
    
	public static SessionFactory getSessionFactory() {
		if(sessionFactory == null) sessionFactory = buildSessionFactory();
        return sessionFactory;
    }
	
	public static SessionFactory getSessionAnnotationFactory() {
		if(sessionAnnotationFactory == null) sessionAnnotationFactory = buildSessionAnnotationFactory();
        return sessionAnnotationFactory;
    }
	
	public static SessionFactory getSessionJavaConfigFactory() {
		if(sessionJavaConfigFactory == null) sessionJavaConfigFactory = buildSessionJavaConfigFactory();
        return sessionJavaConfigFactory;
    }
	
}

創建XML配置的SessionFactory與基於注釋的映射相同。對於基於屬性的配置,我們需要在創建SessionFactory之前在Configuration對象中設置屬性並添加注釋類。總體創建SessionFactory包括以下步驟:

  1. 創建Configuration對象並進行配置
  2. 創建ServiceRegistry對象並應用配置設置。
  3. 使用configuration.buildSessionFactory(),將ServiceRegistry對象作為參數傳遞以獲取SessionFactory對象。

我們的應用程式現在幾乎完成了,讓我們編寫一些測試程式並執行它們。

Hibernate XML 配置測試

我們的測試程式如下所示。

package com.journaldev.hibernate.main;

import java.util.Date;

import org.hibernate.Session;

import com.journaldev.hibernate.model.Employee;
import com.journaldev.hibernate.util.HibernateUtil;

public class HibernateMain {

	public static void main(String[] args) {
		Employee emp = new Employee();
		emp.setName("Pankaj");
		emp.setRole("CEO");
		emp.setInsertTime(new Date());
		
		//取得 Session
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		//開始事務
		session.beginTransaction();
		//保存模型物件
		session.save(emp);
		//提交事務
		session.getTransaction().commit();
		System.out.println("Employee ID="+emp.getId());
		
		//終止 Session Factory,否則程式不會結束
		HibernateUtil.getSessionFactory().close();
	}

}

該程式是自解釋的,當我們執行測試程式時,會獲得以下輸出。

May 06, 2014 12:40:06 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
May 06, 2014 12:40:06 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.5.Final}
May 06, 2014 12:40:06 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
May 06, 2014 12:40:06 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
May 06, 2014 12:40:06 AM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: hibernate.cfg.xml
May 06, 2014 12:40:06 AM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: hibernate.cfg.xml
May 06, 2014 12:40:07 AM org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: employee.hbm.xml
May 06, 2014 12:40:08 AM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Hibernate Configuration loaded
Hibernate serviceRegistry created
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost/TestDB]
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=pankaj, password=****}
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 1 (min=1)
May 06, 2014 12:40:08 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
May 06, 2014 12:40:08 AM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
May 06, 2014 12:40:08 AM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select max(ID) from EMPLOYEE
Hibernate: insert into EMPLOYEE (NAME, ROLE, insert_time, ID) values (?, ?, ?, ?)
Employee ID=19
May 06, 2014 12:40:08 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost/TestDB]

請注意,它會列印生成的員工 ID,您可以檢查資料庫表格來確認。

Hibernate 注解配置測試

package com.journaldev.hibernate.main;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.journaldev.hibernate.model.Employee1;
import com.journaldev.hibernate.util.HibernateUtil;

public class HibernateAnnotationMain {

	public static void main(String[] args) {
		Employee1 emp = new Employee1();
		emp.setName("David");
		emp.setRole("Developer");
		emp.setInsertTime(new Date());
		
		//取得 Session
		SessionFactory sessionFactory = HibernateUtil.getSessionAnnotationFactory();
		Session session = sessionFactory.getCurrentSession();
		//開始事務
		session.beginTransaction();
		//保存模型物件
		session.save(emp);
		//提交事務
		session.getTransaction().commit();
		System.out.println("Employee ID="+emp.getId());
		
		//終止 Session Factory,否則程式不會結束
		sessionFactory.close();
	}

}

當我們執行上述程式時,會獲得以下輸出。

May 06, 2014 12:42:22 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
May 06, 2014 12:42:22 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.5.Final}
May 06, 2014 12:42:22 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
May 06, 2014 12:42:22 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
May 06, 2014 12:42:22 AM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: hibernate-annotation.cfg.xml
May 06, 2014 12:42:22 AM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: hibernate-annotation.cfg.xml
May 06, 2014 12:42:23 AM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Hibernate Annotation Configuration loaded
Hibernate Annotation serviceRegistry created
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost/TestDB]
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=pankaj, password=****}
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
May 06, 2014 12:42:23 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
May 06, 2014 12:42:23 AM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
May 06, 2014 12:42:23 AM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Employee ID=20
May 06, 2014 12:42:23 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost/TestDB]

請查看輸出結果,並將其與基於XML的配置的輸出進行比較,您將會注意到一些差異。例如,對於基於註解的配置,我們沒有設置連接池大小,所以它的默認值為20。

Hibernate Java配置測試

package com.journaldev.hibernate.main;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.journaldev.hibernate.model.Employee1;
import com.journaldev.hibernate.util.HibernateUtil;

public class HibernateJavaConfigMain {

	public static void main(String[] args) {
		Employee1 emp = new Employee1();
		emp.setName("Lisa");
		emp.setRole("Manager");
		emp.setInsertTime(new Date());
		
		//獲取Session
		SessionFactory sessionFactory = HibernateUtil.getSessionJavaConfigFactory();
		Session session = sessionFactory.getCurrentSession();
		//開始事務
		session.beginTransaction();
		//保存模型對象
		session.save(emp);
		//提交事務
		session.getTransaction().commit();
		System.out.println("Employee ID="+emp.getId());
		
		//結束session factory,否則程序將不會結束
		sessionFactory.close();
	}

}

上述測試程序的輸出結果為:

May 06, 2014 12:45:09 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
May 06, 2014 12:45:09 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.5.Final}
May 06, 2014 12:45:09 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
May 06, 2014 12:45:09 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Hibernate Java Config serviceRegistry created
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost/TestDB]
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=pankaj, password=****}
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
May 06, 2014 12:45:09 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
May 06, 2014 12:45:10 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
May 06, 2014 12:45:10 AM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
May 06, 2014 12:45:10 AM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
May 06, 2014 12:45:10 AM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Employee ID=21
May 06, 2014 12:45:10 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost/TestDB]

這就是Hibernate入門教程的全部內容,希望它足以讓您開始。我們將在未來的教程中介紹Hibernate框架的不同功能。從下面的鏈接下載完整的項目並進行更多的實驗來學習更多。

下載Hibernate初學者項目

Source:
https://www.digitalocean.com/community/tutorials/hibernate-tutorial-for-beginners