Soul-Learner 2008. 8. 5. 12:33

Hibernate 3.2 설치후 샘플 프로그램 테스트

Hibernate 3.2 를 다운로드하고 Eclipse에 라이브러리를 등록해주었다면, 간단한 예제를 실행하여 설치상태를 확인해 본다. Eclipse에 Hibernate3.2를 설정하는 예는 http://micropilot.tistory.com/category/Hibernate/Setting-Up 를 참고한다.





위의 그림과 같이 테스트를 위한 파일은 총 4개로 구성했다. 사용하려는 예제는 hibernate.org에서 제공되는 설명서에서 소스를 구하고 약간만 수정한 상태이다.



구성파일 소개

Event.java : 데이터베이스 테이블과 맵핑될 자바 클래스

EventManager.java : Hibernate를 사용하여 데이터베이스 테이블과 Event객체를 맵핑하여 테이블에 레코드를 저장하고 가져오는 예를 보여주는 클래스(main메소드 포함)

Event.hbm.xml : Event클래스의 속성과 Events 테이블의 컬럼을 매핑하는 정보저장

hibernate.cfg.xml : 데이터베이스 연결정보 저장(dburl, jdbc driver, id, password, connection pool 등)

참고: xml 파일은 class path의 루트에 위치하도록 되어 있으므로 src 안에 둔다.



구성파일 소스

Event.java

package events;

import java.util.Date;

public class Event {
 
    private Long id;

    private String title;
    private Date date;

    public Event() {}

    public Long getId() {
        return id;
    }

    private void setId(Long id) {
        this.id = id;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}


Event.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="events.Event" table="EVENTS">
        <id name="id" column="EVENT_ID">
            <generator class="sequence"/>
        </id>
        <property name="date" type="timestamp" column="EVENT_DATE"/>
        <property name="title"/>
    </class>

</hibernate-mapping>



hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
      <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
      <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:ORCL</property>
      <property name="hibernate.connection.username">scott</property>
      <property name="hibernate.connection.password">tiger</property>
      <property name="hibernate.connection.pool_size">2</property>
      <property name="show_sql">true</property>
      <property name="dialect">org.hibernate.dialect.OracleDialect </property>
      <property name="hibernate.hbm2ddl.auto">update</property>
      <!-- Mapping files -->
      <mapping resource="Event.hbm.xml"/>
</session-factory>
</hibernate-configuration>


EventManager.java

package events;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import java.util.*;

public class EventManager {

    public static void main(String[] args) {
        EventManager mgr = new EventManager();

        if (args[0].equals("store")) {
            mgr.createAndStoreEvent("My Event", new Date());
        }
        else if (args[0].equals("list")) {
            List events = mgr.listEvents();
            for (int i = 0; i < events.size(); i++) {
                Event theEvent = (Event) events.get(i);
                System.out.println("Event: " + theEvent.getTitle() +
                                   " Time: " + theEvent.getDate());
            }
        }
     }

    private void createAndStoreEvent(String title, Date theDate) {
    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
    Session session =sessionFactory.openSession();
 
    org.hibernate.Transaction tx =  session.beginTransaction();
 
    Event theEvent = new Event();
    theEvent.setTitle(title);
    theEvent.setDate(theDate);
 
    session.save(theEvent);
 
    session.getTransaction().commit();
    //tx.commit(); // 이것도 가능함

    session.flush();
    session.close();
    }
   
  private List listEvents() {

    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
    Session session =sessionFactory.openSession();

    session.beginTransaction();

    List result = session.createQuery("from Event").list();

    session.getTransaction().commit();
    session.flush();
    session.close();
    return result;
    }
}




Eclipse에서 실행

main 메소드에서 커맨드라인 아규먼트를 이용하고 있으므로 EventManager를 실행할 때는 커맨드라인 아규먼트를 전달해 주어야 한다.








Oracle SQL Plus에서 확인한다.

SQL> select * from events;

  EVENT_ID EVENT_DA TITLE
---------- ----------- ---------------
    1            08/08/05    My Event

SQL>




데이터베이스에서 가져오는 기능 테스트




log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select event0_.EVENT_ID as EVENT1_0_, event0_.EVENT_DATE as EVENT2_0_, event0_.title as title0_ from EVENTS event0_
Event: My Event Time: 2008-08-05 12:48:24.0