donaricano-btn

하이버네이트 + 스프링(2)


1. ServiceImpl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package sample.service;
 
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import sample.dao.UserDao;
import sample.domain.User;
 
@Service
public class UserServiceImpl implements UserService{
     
    @Autowired
    private UserDao UserDao;
     
    public void saveUser(User user) {
        UserDao.saveUser(user);
    }
     
    public List<User> findUser(){
        return UserDao.findUser();
    }
 
    public void removeUser(User user){
        UserDao.removeUser(user);
    }
}

- 스프링 인티그레이션 기능으로 비즈니스 로직의 세션 관련 오브젝트가 삭제되었다

2. DaoImpl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package sample.dao;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;
import sample.domain.User;
 
@Repository
public class UserDaoImpl implements UserDao{
     
    @Autowired
    private HibernateTemplate hibernateTemplate;
     
    public List<User> findUser(){
        return hibernateTemplate.find("from User");
    }
 
    public void saveUser(User user) {
        hibernateTemplate.saveOrUpdate(user);
    }
     
    public void removeUser(User user){
        hibernateTemplate.delete(user);
    }
 
}
 

- 하이버네이트의 세션 오브젝트가 제공하는 CRUD는 HibernateTemplate 클래스를 통해 이용한다

3. 하이버네이트 3.0.1 이후 버전

- 3 이후 버전에서는 HibernateTemplate을 사용하지 않고 구현 가능

1) getCurrentSession

- SessionFactory의 getCurrentSession()를 실행하면 현재 사용중인 Session 오브젝트를 가져올수있다(트랜잭션 매니저로 관리되는 세션 오브젝트를 가져올 수 있다)

2) HibernateTemplate을 사용하지 않고 구현

1
2
3
4
5
6
7
8
9
10
11
12
@Repository
public class UserDaoImpl implements UserDao{
     
    @Autowired
    private SessionFactory sessionFactory;
        Session session = sessionFactory.getCurrentSession();
         
    Query query = session.createQuery("from User");
        return query.list();
     
 
}
 

a. SessionFactory 직접 사용의 장점

- 하이버네이트에서 제공하는 모든 API를 사용가능

- 하이버네이트에 익숙한 개발자라면 API만 의식하면 되므로 효율적 개발가능

b. 단점

- 직접 세션 오브젝트를 사용하므로 위험할 수 있다

- HibernateTemplate은 안전하지만 버전 4에서 지원 안함


FullSource - https://github.com/KyleJeong/Hibernate/tree/master/hiberSpring


블로그 이미지

리딩리드

,
donaricano-btn

하이버네이트 + 스프링(1)

- 하이버네이트와 스프링을 같이 사용함으로 독립성 높인 간단한 코드가 된다


1. 폴더 구성

2. 정의 파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?xml version="1.0" encoding="UTF-8"?>
    xsi:schemaLocation="
   
  <mvc:annotation-driven/>
   
  <!-- 1 -->
  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl1"/>
    <property name="username" value="HJEONG"/>
    <property name="password" value="1111"/>
  </bean>
  <!-- 2 -->
  <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mappingResources">
            <list>
                <value>sample/dao/User.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>
  <!-- 3 -->
  <bean class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"/>
  </bean>
  <!-- 4 -->
   <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
   </bean>
   <!-- 5 -->
    <aop:config>
        <aop:advisor advice-ref="txAdvice"
            pointcut="execution(* *..*Service*.*(..))" />
    </aop:config>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="find*" read-only="true" />
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="remove*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
     
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
  </bean>
   
   <context:component-scan base-package="sample"/>
 
</beans>

1) 데이터 베이스를 정의한다

2) 하이버네이트의 세션 오브젝트를 작성하고 SessionFactory 클래스를 정의한다

3) 스프링이 제공하는 HibernateTemplate 클래스를 정의한다

- 하이버네이트를 더 단순하게 사용할 수 있고 범용 데이터 엑세스 예외로 변환 해준다

- HibernateTemplate 내부는 SessionFactory를 사용, 그러므로 2에서 정의한 프로퍼티를 받는다

4,5) 하이버네이트 트랜잭션 설정

- 하이버네이트 트랜잭션 매니저로 HibernateTransactionManager를 사용한다

- 위 예제는 선언적 트랜잭션으로 Service로 이름이 끝나거나 find, add, remove 모두 대상이됨

FullSource - https://github.com/KyleJeong/Hibernate/tree/master/hiberSpring
블로그 이미지

리딩리드

,
donaricano-btn

단순 하이버네이트 예제


- 하이버네이트만을 이용하면 세션의 열기/ 닫기와 예외처리를 개발자가 기술해야 하기 때문에 소스가 길어짐

- 트랜잭션은 명시적 트랜잭션이됨

- 비즈니스 로직층과 데이터 액세스 층의 강한 연결


1. 폴더구성

2. pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
  <modelVersion>4.0.0</modelVersion>
  <groupId>kyle</groupId>
  <artifactId>hibernate</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>hibernate Maven Webapp</name>
   <properties>
        <org.springframework.version>3.1.1.RELEASE</org.springframework.version>
    </properties>
 
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.8</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>3.6.10.Final</version>
        </dependency>
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.12.0.GA</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jcl</artifactId>
            <version>1.6.4</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.1.0.7.0</version>
        </dependency>
    </dependencies>
     
      <repositories>
         <repository>
            <id>oracle</id>
            <name>ORACLE JDBC Repository</name>
            <url>http://maven.jahia.org/maven2</url>
        </repository>
      </repositories>
 
     
  <build>
    <finalName>hibernate</finalName>
     
     <plugins>
     
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.7</source>
            </configuration>
        </plugin>
         
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <warSourceDirectory>webapp</warSourceDirectory>
            </configuration>
        </plugin>
         
    </plugins>
     
  </build>
</project>

- 오라클 사용

3. hibernate.cfg.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
<hibernate-configuration>
    <session-factory>
        <property name="hbm2ddl.auto">create</property
         <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property
         <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl1</property
         <property name="connection.username">HJEONG</property
         <property name="connection.password">1111</property
         <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property
        <property name="show_sql">true</property>
        <mapping resource="/META-INF/hibernate/Person.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>
 

4. Person.hbm.xml

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 
<hibernate-mapping>
    <class name="domain.Person" table="TEST">
        <id name="num" column="NUM" type="java.lang.Integer">
            <generator class="assigned"/>
        </id>
        <property name="code" column="CODE" type="java.lang.Integer"/>
    </class>
</hibernate-mapping>
 

5. NumDao.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package dao;
 
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
 
import domain.Person;
 
public class NumDao {
    public static int register(Person u){ 
         int i=0
         Session session=new Configuration(). 
          configure().buildSessionFactory().openSession(); 
                   
          Transaction t=session.beginTransaction(); 
          t.begin(); 
                           
          i=(Integer)session.save(u); 
                           
          t.commit(); 
          session.close(); 
             
          return i; 
         
}
 

https://github.com/KyleJeong/Hibernate
블로그 이미지

리딩리드

,
donaricano-btn

하이버네이트 기능


1. HQL

- 하이버네이트는 SQL을 이용하지 않지만 HQL을 이용하여 쿼리 언어를 사용해 검색처리

- HQL은 기본적으로 도메인을 다루는 언어이다 

 SQL

HQL 

 SELECT * FROM EMP

 FROM Emp(Emp는 도메인 클래스 이름)

 SELECT * FROM EMP WHERE ID = '1'

 FROM Emp WHERE ID = '1' (ID는 컬럼이 아닌 프로퍼티)


2. 프라이머리키 생성

- 매핑 파일에서 프라이머리키 유형을 지정, 데이터베이스 시퀀스 및 자동증가를 이용하여 프라이머리키 자동 생성하고 테이블 등록


3. 도메인 클래스의 연관

- 도메인 클래스 간의 연관과 테이블 간의 릴레이션 십을 매핑

- 상속 관계도 가능


4. 지연로드

- 오브젝트를 로드하지 않아 리소스 절약 과 성능향상


5. 캐시

- 로드된 오브젝트를 캐시하여 테이블 액세스 회수를 줄임

- 리소스 절약, 성능 향상

블로그 이미지

리딩리드

,