티스토리 뷰
* 개요
- 앞에서 만든 Spring MVC 프로젝트에 Hibernate 적용하기
- 예전엔 (Spring 2.5 정도?) 환경설정 xml, 각 개체에 대한 xml 정의 등 별도로 생성해야 했는데, 그런거 없이도 가능
* 환경
- Windows 7
- Eclipse Java EE IDE for Web Developers / Luna
* 절차 요약
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 으로 바꿔서 해결
'SW개발 > Spring Framework' 카테고리의 다른 글
Hibernate /Not all named parameters have been set (0) | 2017.10.31 |
---|---|
hibernate SQL Error: 1064, SQLState: 42000 (0) | 2017.05.31 |
Eclipse Spring MVC Project 시작 (0) | 2017.05.15 |
Hibernate Session / 동일 쿼리가 몇번 실행되다가 멈추는 현상 (0) | 2017.03.02 |
Spring Junit Test 환경 구성 (1) | 2017.02.13 |