2011년 5월 23일 월요일

Hibernate을 이용한 Web Application 개발 - 3

샘플프로그램

일대다 관계의 테이블을 OR메핑하는 샘플 프로그램을 작성하여 본다.
hibernate.examples.Parent.class
package hibernate.examples;
import java.util.Collection;
import java.util.HashSet;
public class Parent {
private Long id;
private String name;
private Collection children = new HashSet();
public Collection getChildren() {
return children;
}
public void setChildren(Collection children) {
this.children = children;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}


hibernate.examples.Child
package hibernate.examples;
public class Child {
private Long id;
private String name;
private hibernate.examples.Parent parent;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Parent getParent() {
return parent;
}
public void setParent(Parent parent) {
this.parent = parent;
}
}


OR-Mapping 파일
매핑 파일은 클래스와 같은 위치에 저장한다.
Parent.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 package="hibernate.examples">
<class name="Parent" table="Parent">
<id name="id" column="parent_id">
<generator class="increment"/>
</id>
<property name="name"/>
<set name="children" table="ParentChild" cascade="all" inverse="true">
<key column="parent_id"/>
<many-to-many column="child_id" class="Child"/>
</set>
</class>
</hibernate-mapping>


Child.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 package="hibernate.examples">
<class name="Child" table="Child">
<id name="id" column="child_id">
<generator class="increment"/>
</id>
<property name="name"/>
<join table="ParentChild" optional="true">
<key column="child_id"/>
<many-to-one name="parent" column="parent_id" not-null="true"/>
</join>
</class>
</hibernate-mapping>


OR-Mapping 스키마
<class> - OR매핑에 사용될 클래스와 테이블을 명시한다.
<id> - DB 테이블의 주요키와 매핑되는 객체의 프로퍼티를 설정
<property> - 객체에서 DB 테이블과 매핑될 프로퍼티의 이름 명시
<column> - <id>나 <property> 태그로 지정한 프로퍼티와 매핑되는 DB테이블의 필드에 대한 정보 지정
<generator> - 키값 생성기(increment, sequence, identity, native, assigned, foregin)
<many-to-one> - 1:n관계에서 n클래스에서 1클래스를 바라보는 입장, 즉 n 클래스에서 1클래스를 정의하는 방식
<bag> - collection을 나타내는 태그는 set, map, list, array, bag 등이 있다.
이들을 mapping파일에 선언할때 사용
<key> - 컬렉션의 fk 컬럼명, many-to-one에 정의된 테이블 컬럼명이기도 하다.
<one-to-many> - 콜렉션의 데이터가 되는 클래스
보다 자세한 OR-Mapping 설명은 “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd” 을 참고 하십시오.

Hibernate Config 파일
Config 파일은 /WEB-INF/classes 나 /WEB-INF/lib 디렉토리에 저장 한다.
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.datasource">MYSQL</property>
<property name="show_sql">
false
</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="hibernate/examples/Parent.hbm.xml"/>
<mapping resource="hibernate/examples/Child.hbm.xml"/>
</session-factory>
</hibernate-configuration>
<!--
<hibernate-configuration>
<session-factory name="MYSQL">
<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">xhvkwm9</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update </property>
<mapping resource="hibernate/examples/Parent.hbm.xml"/>
<mapping resource="hibernate/examples/Child.hbm.xml"/>
</session-factory>
</hibernate-configuration>
-->

hibernate.connection.driver_class – JDBC 드라이버 클래스
hibernate.connection.url – JDBC URL
hibernate.connection.username – DB 사용자 이름
hibernate.connection.password – DB 사용자 암호
hibernate.connection.pool_size – 커넥션 풀의 최대 크기 명시(선택)
dialect – 특정 DBMS가 제공하는 기능을 사용
mapping – 이 세션과 관련된 매핑 설정 파일 명시
show_sql – 쿼리문을 로그에 보여줌
hbm2ddl.auto – (update|create|create-drop)
update – 테이블이 없으면 생성하고 있으면 생성하지 않는다.
create – SessionFactory가 생성될 때마다 테이블을 생성한다. 테이블이 있으 면 삭제하고 만든다.
create-drop – SessionFactory가 생성될 때 테이블을 생성하고 close() 할 때 테이블을 삭제한다.
Dialet
해당 DBMS에 해당하는 Dialet을 지정해준다. Hibernate에서는 다양한 DBMS의 Dialet을 제공하고 있다.(Hibernate API 참고)


Client Program Sample
hibernate.examples.HibernateHelper.class
package hibernate.examples;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateHelper {
private static Log log = LogFactory.getLog(HibernateHelper.class);
private static final SessionFactory sessionFactory;
public static final ThreadLocal session = new ThreadLocal();
static {
try {
sessionFactory = new Configuration().configure().buildSessionFactory(); --- 1
} catch (Throwable ex) {
log.error("Initial SessionFactory creation failed.", ex);
ex.printStackTrace();
throw new ExceptionInInitializerError(ex);
}
}
public static Session currentSession() {
Session s = (Session) session.get();
if (s == null) {
s = sessionFactory.openSession(); --- 2
session.set(s);
}
return s;
}
public static void closeSession() {
Session s = (Session) session.get();
if (s != null)
s.close(); --- 3
session.set(null);
}
}

1. configure() : 설정 파일(properties, xml) Loading, buildSessionFactory() : SessionFactory 인스턴스 생성
2. openSession() : 새로운 Session 생성;
3. close() : 해당 Session 종료

import Class
import org.hibernate.Session ;
import org.hibernate.Transaction ;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;


Insert DATA
hbSession = HibernateHelper.currentSession();
tx = hbSession.beginTransaction(); --- 1
Child c = new Child();
c.setName("Child One");
Parent p = new Parent();
p.setName("Parent");
p.getChildren().add(c);
c.setParent(p);
hbSession.save(p);
hbSession.flush(); --- 2
tx.commit(); --- 3
HibernateHelper.closeSession ();

1. beginTransaction() : 트랜젝션 시작을 선언한다.

2. Session flush() : 시간에 따라 Session 은 JDBC 커넥션의 상태와 메모리 내에 보관된 객체들의 상태를 동기화 시키는데 필요한 SQL 문장들을 실행시킬 것이다.
flush 는 다음 시점들에서 디폴트로 발생한다
- org.hibernate.Transaction.commit()
- Session.flush()
SQL 문장들은 다음 순서로 실행 명령이 내려진다
1. Session.save()를 사용하여 저장되었던 것과 같은 순서로, 모든 엔티티가 insert 된다.
2. 모든 엔티티가 업데이트 된다.
3. 모든 콜렉션이 삭제된다.
4. 모든 콜렉션 요소가 삭제되고, 업데이트 되고, 그리고 insert 된다.
5. 모든 콜렉션이 insert 된다.
6. Session.delete()를 사용하여 삭제되었던 것과 같은 순서로, 모든 엔티티가 삭제된다.

3. commint(), rollback()
Select DATA
Parent item =
(Parent) hbSession.get(Parent.class, parent_id);


Delete DATA
à Case 1 : Child delete
p.getChildren().remove(c);
c.setParent(null);
hbSession.flush();
à Case 2 : Parent delete
Parent p =
(Parent) hbSession.get(Parent.class, parent_id);
hbSession.delete(p);


Update DATA
hbSession.update(c);


DATA를 조회 하는 방법
1. Hibernate Query Language (HQL)
SQL과 비슷한 방법으로 데이터를 조회할 수 있도록 해주는 Hibernate가 제공하는 쿼리 언어
Query query = session.createQuery(
“from Member as member where member.id = :id”);
Query.setParameter(“id”, “test”);
List list = query.list();
For(int i = 0; i < list.size(); i++) {
Item item = (Item)list.get(i);
}

- from 클래스 이름 ‘클래스 이름’과 관련된 테이블로부터 모든 행 데이터를 읽어온다.
- Where 에서는 persistant 객체의 프로퍼티명을 사용

2. Criteria Queries (QBC)
자바 클래스를 이용해서 다양한 검색 조건을 명시할 수 있도록 해주는 API
includes Query By Example (QBE)
Criteria crit = session.createCriteria(Item.class);
Crit.add(Expression.eq(“id”, new Integer(10));
List list = crit.list();

- SimpleExpression eq(String propertyName, Object value) : 프로퍼티의 값이 value와 같은지 검사하는 조건을 생성한다.

3. Native SQL queries
데이터베이스의 native SQL dialect로 질의들을 표현할 수 있다.
Query query = session.createSQLQuery(
“select {member.*} from member as member”).addEntity(“member”, Member.class)
.setMaxResults(50);
List list = query.list();

- addEntity() : SQL 테이블 alias들을 엔티티 클래스들과 연관짓고, 질의 결과 셋의 형태를 결정한다.

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...