티스토리 뷰

Hibernate ORM Framework 시작하기.

Hibernate는 ORM기반의 Framework로 오직 객체와 Database Table Mapping을 

통해 RDBMS에 접근 가능하도록 모델을 설계한 Framework 이다.



Mybatis 사용 시 SQL 작성 후 Resultset을 통해 DB Access하는 것보다 심플하기 때문에

빠른생산성을 이유로 많이 사용하고 있다. 이러한 ORM개념은 이미 Ruby on Rails를

필두로 Python Django, Node.js의 node-orm, Java JPA등을 통해 지원하고 있다.


Hibernate 설정을 통해 간단한 Application을 작성해 보았다.


개발 환경

Spring Framework 3.2

Maven 3.0.4

Hibernate 4.3.10

MySQL 5.5


step 1. Maven Dependency 추가

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

<dependency>
  <groupId>org.hibernate.common</groupId>
  <artifactId>hibernate-commons-annotations</artifactId>
  <version>4.0.5.Final</version>
</dependency>

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.6</version>
</dependency>


step 2. Table 생성 

DROP TABLE IF EXISTS `stock`;
CREATE TABLE `stock` (
  `STOCK_ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `STOCK_CODE` VARCHAR(10) NOT NULL,
  `STOCK_NAME` VARCHAR(20) NOT NULL,
  PRIMARY KEY (`STOCK_ID`) USING BTREE,
  UNIQUE KEY `UNI_STOCK_NAME` (`STOCK_NAME`),
  UNIQUE KEY `UNI_STOCK_ID` (`STOCK_CODE`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


step 3. Stock.java 파일 작성

Stock 객체를 생성한다. DB 컬럼과 매칭하여 생성하도록 한다.

Stock.java

package kr.co.rocksea;


/**
 * Model class for Stock
 */
public class Stock implements java.io.Serializable {
 
    private static final long serialVersionUID = 1L;
 
    private Integer stockId;
    private String stockCode;
    private String stockName;
 
    public Stock() {
    }
 
    public Stock(String stockCode, String stockName) {
        this.stockCode = stockCode;
        this.stockName = stockName;
    }
 
    public Integer getStockId() {
        return this.stockId;
    }
 
    public void setStockId(Integer stockId) {
        this.stockId = stockId;
    }
 
    public String getStockCode() {
        return this.stockCode;
    }
 
    public void setStockCode(String stockCode) {
        this.stockCode = stockCode;
    }
 
    public String getStockName() {
        return this.stockName;
    }
 
    public void setStockName(String stockName) {
        this.stockName = stockName;
    }
 
}


step 4. Stock.hbm.xml 파일 설정

Stock 객체와 Table간의 Mapping 위한 XML파일을 생성한 뒤

kr.co.igrove 패키지에 파일을 추가한다.

Stock.hbm.xml

<?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>
    <class name="kr.co.rocksea.Stock" table="stock" catalog="rocksea">
        <id name="stockId" type="java.lang.Integer">
            <column name="STOCK_ID" />
            <generator class="identity" />
        </id>
        <property name="stockCode" type="string">
            <column name="STOCK_CODE" length="10" not-null="true" unique="true" />
        </property>
        <property name="stockName" type="string">
            <column name="STOCK_NAME" length="20" not-null="true" unique="true" />
        </property>
    </class>
</hibernate-mapping>


step 5. hibernate.cfg.xml 파일 설정

DB 정보 및 XML Mapping Resource에 대한 내용 및 Hibernate관련 설정을 한다.

hibernate.cfg.xml

<?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.bytecode.use_reflection_optimizer">false</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">1234</property>
        <property name="hibernate.connection.url">jdbc:mysql://192.168.0.200:3306/rocksea</property>
        <property name="hibernate.connection.username">rocksea</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <mapping resource="kr/co/rocksea/Stock.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>


step 6. HibernateUtil.java 작성

Hibernate Session에대한 관리를 위한 객체 class파일을 생성한다.

HibernateUtil.java

package kr.co.rocksea;

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


public class HibernateUtil {

   private static SessionFactory sessionFactory;

   public static SessionFactory getSessionFactory() {
       if (sessionFactory == null) {
           // loads configuration and mappings
           Configuration configuration = new Configuration().configure();
           ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                   .applySettings(configuration.getProperties()).build();
            
           // builds a session factory from the service registry
           sessionFactory = configuration.buildSessionFactory(serviceRegistry);           
       }
        
       return sessionFactory;
   }

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

}


step 7. DB Table Record 저장

이제 DB Table에 값을 넣어보도록 한다.

@RequestMapping(value = "/hibernate", method = RequestMethod.GET)
    public String hibernate(Locale locale, Model model) {
        logger.info("Welcome home! The client locale is {}.", locale);
        
        System.out.println("Maven + Hibernate + MySQL");
        

        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession();

        
        session.beginTransaction();
        Stock stock = new Stock();
 
        stock.setStockCode("1");
        stock.setStockName("rocksea");
 
        session.save(stock);
        session.getTransaction().commit();
        
        
        return "home";
    }


결과 

[그림 1] Record 저장 SQL 출력 화면



mysql> select * from stock;
+----------+------------+------------+
| STOCK_ID | STOCK_CODE | STOCK_NAME |
+----------+------------+------------+
|        1 | 1       |   rocksea     |
+----------+------------+------------+
1 row in set (0.00 sec)


출처 : http://www.mkyong.com/hibernate/quick-start-maven-hibernate-mysql-example/

댓글