웹사이트 검색

초보자를 위한 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. Java 클래스를 데이터베이스 테이블에 매핑하기 위해 XML, 속성 파일 또는 주석을 사용하기 때문에 애플리케이션과 데이터베이스 사이에 추상화 계층을 제공합니다.
  5. Hibernate는 조인, 컬렉션, 상속 개체를 매핑하는 데 도움이 되며 모델 클래스가 데이터베이스 테이블을 나타내는 방법을 쉽게 시각화할 수 있습니다.
  6. Hibernate는 SQL과 유사한 강력한 쿼리 언어(HQL)를 제공합니다. 그러나 HQL은 완전히 객체 지향적이며 상속, 다형성 및 연결과 같은 개념을 이해합니다.
  7. Hibernate는 또한 일부 외부 모듈과의 통합을 제공합니다. 예를 들어 Hibernate Validator는 Bean Validation(JSR 303)의 참조 구현입니다.
  8. Hibernate는 Red Hat Community의 오픈 소스 프로젝트이며 전 세계적으로 사용됩니다. 학습 곡선이 적고 수많은 온라인 문서가 있으며 포럼에서 도움말을 쉽게 사용할 수 있기 때문에 다른 것보다 더 나은 선택입니다.
  9. Hibernate는 다른 Java EE 프레임워크와 쉽게 통합할 수 있으며, Spring Framework가 Spring 애플리케이션과 hibernate 통합을 위한 내장 지원을 제공할 정도로 인기가 높습니다.

위의 모든 이점을 통해 Hibernate가 애플리케이션 개체 관계형 매핑 요구 사항에 대한 최상의 선택임을 확신할 수 있기를 바랍니다. 이제 Hibernate 프레임워크 아키텍처를 살펴본 다음 독립형 Java 애플리케이션에서 Hibernate를 구성하고 사용하는 다양한 방법을 살펴보는 샘플 프로젝트로 이동하겠습니다.

최대 절전 모드 아키텍처

  • SessionFactory(org.hibernate.SessionFactory): SessionFactory는 단일 데이터베이스에 대한 컴파일된 매핑의 불변 스레드 안전 캐시입니다. SessionFactory를 사용하여 org.hibernate.Session의 인스턴스를 얻을 수 있습니다.
  • 세션(org.hibernate.Session): 세션은 애플리케이션과 영구 저장소 간의 대화를 나타내는 단일 스레드의 수명이 짧은 개체입니다. JDBC java.sql.Connection을 래핑하고 org.hibernate.Transaction의 팩토리로 작동합니다.
  • 영구 객체: 영속 객체는 영속적인 상태와 비즈니스 기능을 포함하는 수명이 짧은 단일 스레드 객체입니다. 이들은 일반 JavaBeans/POJO일 수 있습니다. 그들은 정확히 하나의 org.hibernate.Session과 연결됩니다.
  • 일시적인 객체: 일시적인 객체는 현재 org.hibernate.Session과 연결되지 않은 영속 클래스 인스턴스입니다. 애플리케이션에 의해 인스턴스화되었지만 아직 지속되지 않았거나 닫힌 org.hibernate.Session에 의해 인스턴스화되었을 수 있습니다.
  • 트랜잭션(org.hibernate.Transaction): 트랜잭션은 작업의 원자 단위를 지정하기 위해 응용 프로그램에서 사용하는 단일 스레드 단기 개체입니다. 기본 JDBC 또는 JTA 트랜잭션에서 애플리케이션을 추상화합니다. org.hibernate.Session은 경우에 따라 여러 org.hibernate.Transaction에 걸쳐 있을 수 있습니다.
  • ConnectionProvider(org.hibernate.connection.ConnectionProvider): ConnectionProvider는 JDBC 연결을 위한 팩토리입니다. 애플리케이션과 기본 javax.sql.DataSource 또는 java.sql.DriverManager 간의 추상화를 제공합니다. 애플리케이션에 노출되지는 않지만 개발자가 확장할 수 있습니다.
  • TransactionFactory(org.hibernate.TransactionFactory): org.hibernate.Transaction 인스턴스를 위한 팩토리.

최대 절전 모드 및 JPA(Java Persistence API)

Hibernate는 Java Persistence API의 구현을 제공하므로 모델 빈과 함께 JPA 주석을 사용할 수 있으며 Hibernate는 CRUD 작업에 사용되도록 구성을 처리합니다. 주석 예제를 통해 이를 살펴보겠습니다.

최대 절전 모드 예

데이터베이스 테이블 설정

제 예제에서는 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를 사용하므로 Hibernate 4를 사용하고 있기 때문에 필요하지는 않지만 프로젝트에 slf4j-simple 아티팩트를 포함했습니다. mysql-connector-java는 MySQL 데이터베이스에 연결하기 위한 MySQL 드라이버입니다. , 다른 데이터베이스를 사용하는 경우 해당 드라이버 아티팩트를 추가하십시오.

도메인 모델 클래스

위의 이미지에서 볼 수 있듯이 EmployeeEmployee1이라는 두 가지 모델 클래스가 있습니다. Employee는 간단한 Java Bean 클래스이며 매핑 세부 정보를 제공하기 위해 XML 기반 구성을 사용합니다. Employee1은 필드에 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 클래스는 간단한 자바 빈이므로 여기서 특별히 논의할 내용은 없습니다.

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 주석은 최대 절전 모드가 JPA 구현을 제공하므로 최대 절전 모드에서 유지할 수 있는 엔티티 빈으로 클래스를 표시하는 데 사용됩니다. javax.persistence.Table 주석은 열에 대한 테이블 매핑 및 고유 제약 조건을 정의하는 데 사용됩니다. javax.persistence.Id 주석은 테이블의 기본 키를 정의하는 데 사용됩니다. javax.persistence.GeneratedValue는 필드가 자동 생성되도록 정의하는 데 사용되며 GenerationType.IDENTITY 전략은 생성된 "id\ 값이 Bean에 매핑되고 자바 프로그램. javax.persistence.Column은 필드를 테이블 열과 매핑하는 데 사용되며 빈 속성에 대한 길이, null 허용 및 고유성을 지정할 수도 있습니다.

Hibernate 매핑 XML 구성

위에서 설명한 것처럼 Employee 클래스 매핑에 XML 기반 구성을 사용합니다. 임의의 이름을 선택할 수 있지만 명확성을 위해 테이블 또는 자바 빈 이름으로 선택하는 것이 좋습니다. 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 구성 xml 파일을 만들 것입니다. 하나는 xml 기반 구성용이고 다른 하나는 주석 기반 구성용입니다. 최대 절전 모드.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

XML 기반 구성 및 속성 기반 구성에서 SessionFactory를 생성하는 유틸리티 클래스를 생성했습니다. 속성 기반 구성의 경우 속성 파일을 가지고 클래스에서 읽을 수 있지만 간단히 하기 위해 클래스 자체에서 Properties 인스턴스를 생성합니다.

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 based configuration
	private static SessionFactory sessionFactory;
	
	//Annotation based configuration
	private static SessionFactory sessionAnnotationFactory;
	
	//Property based configuration
	private static SessionFactory sessionJavaConfigFactory;

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
        	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) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    private static SessionFactory buildSessionAnnotationFactory() {
    	try {
            // Create the SessionFactory from hibernate.cfg.xml
        	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) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
	}

    private static SessionFactory buildSessionJavaConfigFactory() {
    	try {
    	Configuration configuration = new Configuration();
		
		//Create Properties, can be read from property files too
		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);
		
		//we can set mapping file or class with annotation
		//addClass(Employee1.class) will look for resource
		// com/journaldev/hibernate/model/Employee1.hbm.xml (not good)
		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 생성은 매핑이 XML 기반이든 주석 기반이든 동일합니다. 속성 기반의 경우 Configuration 객체에서 속성을 설정하고 SessionFactory를 생성하기 전에 주석 클래스를 추가해야 합니다. 전반적인 SessionFactory 생성에는 다음 단계가 포함됩니다.

  1. 구성 객체 생성 및 구성
  2. ServiceRegistry 객체 생성 및 구성 설정 적용
  3. ServiceRegistry 개체를 인수로 전달하여 configuration.buildSessionFactory()를 사용하여 SessionFactory 개체를 가져옵니다.

이제 애플리케이션이 거의 준비되었습니다. 몇 가지 테스트 프로그램을 작성하고 실행해 보겠습니다.

최대 절전 모드 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());
		
		//Get Session
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		//start transaction
		session.beginTransaction();
		//Save the Model object
		session.save(emp);
		//Commit transaction
		session.getTransaction().commit();
		System.out.println("Employee ID="+emp.getId());
		
		//terminate session factory, otherwise program won't end
		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());
		
		//Get Session
		SessionFactory sessionFactory = HibernateUtil.getSessionAnnotationFactory();
		Session session = sessionFactory.getCurrentSession();
		//start transaction
		session.beginTransaction();
		//Save the Model object
		session.save(emp);
		//Commit transaction
		session.getTransaction().commit();
		System.out.println("Employee ID="+emp.getId());
		
		//terminate session factory, otherwise program won't end
		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());
		
		//Get Session
		SessionFactory sessionFactory = HibernateUtil.getSessionJavaConfigFactory();
		Session session = sessionFactory.getCurrentSession();
		//start transaction
		session.beginTransaction();
		//Save the Model object
		session.save(emp);
		//Commit transaction
		session.getTransaction().commit();
		System.out.println("Employee ID="+emp.getId());
		
		//terminate session factory, otherwise program won't end
		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 Beginners 프로젝트 다운로드