티스토리 뷰

* 개요 

- 앞에서 만든 Spring MVC 프로젝트에 Hibernate 적용하기

- 예전엔 (Spring 2.5 정도?) 환경설정 xml, 각 개체에 대한 xml 정의 등 별도로 생성해야 했는데,  그런거 없이도 가능


* 환경 

- Windows 7

- Eclipse Java EE IDE for Web Developers / Luna

- MySQL 5.5

- Spring MVC / Maven


* 절차 요약

1. Hibernate 관련 JAR 추가 

2. MySQL 에 Schema / Table 생성

3. rootContext.xml 파일 설정

4. DAO 클래스 선언





* 1. Hibernate 관련 JAR 추가 

- maven 이용, pom.xml 에 다음을 추가함.


<properties>

...

<org.springframework-version>3.1.1.RELEASE</org.springframework-version>

<hibernate.version>3.6.10.Final</hibernate.version>

...

</properties>


<dependencies>

...

<!-- 170514 Hibernate -->

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.42</version>

</dependency>

<dependency>

   <groupId>org.springframework</groupId>

   <artifactId>spring-orm</artifactId>

   <version>${org.springframework-version}</version>

</dependency>

<dependency>

   <groupId>org.springframework</groupId>

   <artifactId>spring-jdbc</artifactId>

   <version>${org.springframework-version}</version>

</dependency>

<dependency>

   <groupId>org.hibernate</groupId>

   <artifactId>hibernate-core</artifactId>

   <version>${hibernate.version}</version>

</dependency>

<dependency>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-entitymanager</artifactId>

<version>${hibernate.version}</version>

</dependency>

     

    <dependency>

   <groupId>commons-dbcp</groupId>

   <artifactId>commons-dbcp</artifactId>

   <version>1.2.2</version>

</dependency>

...

- 이렇게 하면 Jar 선언이 끝남




* 2. MySQL 에 Schema / Table 생성


- 테스트를 위해서 다음을 생성함

-Schema : test

- Table : T0516

- 여기는 표시 안 되어있지만 AI(AUTO INCREMENT) 선언되어야, ID 자동생성 가능함




* 3. root-context.xml 파일 설정

- 환경에 따라 파일명은 조금씩 다를 수 있음.

- 1) MySQL 에 연결되는 DataSource 와,  2) DefaultLobHandler,  3) 하이버네이트에서 사용하게 될 SessionFactory 를 선언해야 함.


<!-- 1. 데이터 소스  -->

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">

<property name="driverClassName" value="com.mysql.jdbc.Driver" />

<property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8" />

<property name="username" value="root" />

<property name="password" value="비밀번호" />

</bean>




<!--  2. defaultLobHandler -->

<bean id="defaultLobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" />




<!-- 3. Hibernate SessionFactory? -->

<bean id="sessionFactory"

class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"  primary="true">

<property name="dataSource" ref="dataSource">

</property>

<property name="lobHandler" ref="defaultLobHandler" />

<property name="packagesToScan">

<list>

<value>com.dogcowking.prac3</value>

</list>

</property>

<property name="hibernateProperties">

<props>

<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

<prop key="hibernate.format_sql">true</prop>

<prop key="hibernate.hbm2ddl.auto">update</prop>

<prop key="hibernate.generate_statistics">false</prop> <!-- 161214 쿼리 실행시간 로그 표시 추가 -->

<prop key="hibernate.current_session_context_class">thread</prop> <!-- getCurrentSession 위해 추가 170308 -->

<prop key="hibernate.order_inserts">true</prop> <!--  170310 bulk Insert 위해 -->

<prop key="hibernate.order_updates">true</prop> 

<prop key="hibernate.jdbc.batch_size">30</prop> 



</props>

</property>

</bean>

- 참고 : packagesToScan에 선언된 패키지의 Annotation 을 자동으로 인식

- 참고 : root-context.xml 위치 (Package explorer)




* 4. Entity 클래스 선언

- MySQL 에 선언된 T0516 테이블과 매칭될 클래스

@Entity

//@Table(name="T0516") // 이름 같다면 굳이 안필요

public class T0516 {

@Id

    @GeneratedValue(strategy=GenerationType.AUTO) // id 자동으로 생성되게 하기 위해 필요

@Column

Integer id;

@Column

String col1;

@Column

Integer col2;

// GETTER/ SETTER 선언해야...

- GerneratedValue... 선언되어 ID 지정 하지 않더라도 순차적으로 생성됨

(DB에서 AUTO INCREMENT 도 선언되어야)


- getter/setter 는 생략됨 알아서 생성해야..





* 5. DAO 클래스 선언

- 위에 선언한 T0516 을 사용하기 위한 DAO 를 선언해야 함.

@Repository

public class Dao  extends HibernateDaoSupport {

@Autowired

public Dao(SessionFactory sf) {

super.setSessionFactory(sf);

}

}

- root-context 에서 선언한 SessionFactory 가 자동으로 연결됨..




* 참고 : 편의를 위해서 MVC 구조나 패키지로 구분 하지 않고 한곳에 때려박음.

- @Serivce 도 따로 안만듦.




* 6. 테스트

- 1) 기존에 있던 HomeController 에 DAO 연결해주고

- 2) 기존에 쓰던 메서드에 T0516 을 생성하여 DB 저장하는 코드를 만듦.

- localhost:8080/prac3 에 접속시 T0516 테이블에 1개의 Row 가 추가되게 됨.

 - SessionFactory 가 연결되지 않으면 다음 오류가 발생

 java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required

Dao 에 autowired 등 확인.

- Entity가 SessionFactory 에 등록되지 않으면 다음 오류가 발생

org.springframework.orm.hibernate3.HibernateSystemException: Unknown entity: com.dogcowking.prac3.T0516;''

root-context.xml 에서 session factory 선언시 packagesToScan 속성 다시 확인 

- id 컬럼 AUTO INCREMENT 선언되지 않으면 다음 오류 발생

java.sql.SQLException: Field 'id' doesn't have a default value




* 예외상황 #1

java.lang.NoClassDefFoundError: org/hibernate/cache/CacheProvider

- 하이버네이트 버전을 낮추어 해결

4.1.9.Final- >

3.6.10.Final


- 스프링, 하이버네이트 호환되는 버전 찾는 일이 힘든데, 일단 위 오류를 막기위해 버전을 낮추어 사용




* 예외상황 #2

Caused by: java.lang.UnsupportedClassVersionError: com/mysql/jdbc/Driver : Unsupported major.minor version 52.0 (unable to load class com.mysql.jdbc.Driver)

- jdbc driver 가 높은 버전 자바(java 52.0 = java 8 ) 를 요구한 경우

- jdbc driver 버전을 낮춤

6.0.5

-> 5.1.42



* 예외상황 #3

Incorrect string value: '\xEB\xB0\x94\xEB\xB3\xB4' for column 'col1' at row 1

- 위의 실행 예제에서 한글 입력하여 저장시 발생하는 오류 였는데 인코딩 문제임

- Collation 설정은 Schema, Table, Column 별로 설정 가능하고,

-  Schema 에서 처음 선언된게 계속 기본값이 됨..

- latin1  -> utf-8 default collation 으로 바꿔서 해결


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함