- 먼저 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 여기서 참고하길 바란다.