Hibernate + Maven + HSQL 설정

  • 먼저 maven으로 simple project를 만든다.
  • pom.xml에 hsqldb와 하이버네이트 dependency를 추가한다.

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.tistory.jekalmin</groupId>
    <artifactId>hibernate-test</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.3.6.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <version>2.3.2</version>
        </dependency>
    </dependencies>
</project>
  • src/main/resources 밑에 hibernate.cfg.xml을 생성한다.
    • JBoss Tool 이클립스 플러그인안에 Hibernate Tools를 설치했다면 new > Other... > Hibernate Configuration File로 가서 생성할 수 있다.
    • 플러그인 설치를 안하셨다면 그냥 xml 만들어서 붙여넣자.

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.connection.driver_class">org.hsqldb.jdbcDriver</property>
        <property name="hibernate.connection.url">jdbc:hsqldb:mem:test</property>
        <property name="hibernate.connection.username">sa</property>

        <!-- 하이버네이트 엔티티를 hsql에 맞게 변환해주는 클래스 -->
        <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>


        <!-- 커넥션 풀 개수 -->
        <property name="hibernate.connection.pool_size">1</property>

        <!-- hsql에 있는 마지막 연결이 끊어지면 데이터베이스 shutdown 하는 플래그 -->
        <property name="hibernate.connection.shutdown">true</property>

        <!-- 등록된 엔티티의 테이블이 없을 경우 자동으로 생성해주는 설정 -->
        <property name="hibernate.hbm2ddl.auto">create</property>

        <!-- db에 요청한 sql 출력 -->
        <property name="hibernate.show_sql">true</property>

        <!-- 엔티티 등록 -->
        <mapping class="com.test.Member"/>
        <!-- 엔티티 등록 끝 -->
    </session-factory>
</hibernate-configuration>
  • 이제 Member 클래스를 만든다. 예제에서는 com.test 패키지 밑에 만들었다.

Member.java

package com.test;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table
public class Member {
    @Id
    @GeneratedValue
    private int seq;
    private String name;
    private int age;

    public Member(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public int getSeq() {
        return seq;
    }

    @SuppressWarnings("unused")
    private void setSeq(int seq) {
        this.seq = seq;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Member [seq=" + seq + ", name=" + name + ", age=" + age + "]";
    }

}
  • 실행할 Test 클래스를 com.test 패키지 밑에 만든다.

Test.java

package com.test;

import java.util.List;

import org.hibernate.FlushMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class Test {

    static SessionFactory factory;
    static Session session;

    /**
     * hibernate.cfg.xml의 설정을 읽어서
     * db와 연결하는 설정
     */
    static {
        Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
        factory = configuration.buildSessionFactory(builder.build());
        session = factory.openSession();
    }

    public static void main(String[] args) {

        insert();
        detail();
        update();
        delete();

        session.flush(); // delete나 update 한 내용을 커밋한다.

        list();

        session.close();
        factory.close();
    }

    /**
     * 등록
     * Member의 seq는 @GenerateValue 어노테이션에 의해 자동 생성된다.
     */
    private static void insert(){
        Member member1 = new Member("Min", 26);
        Member member2 = new Member("Park", 27);
        session.save(member1);
        session.save(member2);
    }

    /**
     * 상세
     */
    private static void detail(){
        Member member = (Member)session.get(Member.class, 2);
        System.out.println("detail member : " + member);
    }

    /**
     * 리스트
     */
    private static void list(){
        Query query = session.createQuery("from Member"); // from Member에서 Member는 클래스명과 동일 (대소문자구분)
        List members = query.list();
        for(Object member : members){
            System.out.println("list : " + member);
        }
    }

    /**
     * 수정
     * 조회를 먼저 해서 Member를 가져온 후 수정한다.
     */
    private static void update(){
        Member member = (Member) session.get(Member.class, 2);
        member.setAge(60);
        session.save(member);
    }

    /**
     * 삭제
     * 조회를 먼저 해서 Member를 가져온 후 삭제한다.
     */
    private static void delete(){
        Member member = (Member) session.get(Member.class, 1);
        session.delete(member);
    }




}

CRUD 코드를 최소화 하기 위해 하나의 session에서 모든 작업을 했다. session은 default로 FlushMode가 AUTO인데, flush 하는 타이밍은 http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch11.html#objectstate-flushing 여기서 참고하길 바란다.