스프링, 하이버네이트애노테이션예제(SpringFramework, Hibernate Annotation, Oracle, HQL select,
하이버네이트매핑)
아래 실습에서 사용되는 XML파일들은 모두 src/main/resources 아래에 만들었음.
이전 스프링, 하이버네이트 예제와 크게 다른 점은
<!--[if !supportLists]-->- <!--[endif]-->자바파일에
Annotation을 이용하여 작성(Entity
Class인 MyEmp.java 파일이 많이 바뀜)
<!--[if !supportLists]-->- <!--[endif]-->XML파일(myemp.hmb.xml,myemp.xml 파일
삭제됨)
<!--[if !supportLists]-->- <!--[endif]-->Hibernate xml 파일의 sessionFactory 클래스
파일이 AnnotationSessionFactoryBean으로 바뀜
-
Beanlocations.xml에 context:component-scan 패키지 경로
추가
1. 이클립스에서 하이버네이트 유틸리티 프로젝트 나 간단히
스프링프로젝트 하나 만들자.
프로젝트 전체 모양은 아래와 같다.
2. pom.xml은 다음과 같다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.samples.spring</groupId>
<artifactId>spring-hibernate-utility</artifactId>
<version>1.0.0.CI-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Spring
HibernateUtility</name>
<url>http://www.springframework.org</url>
<description>
<![CDATA[This projectis a minimal jar
utility with Spring configuration for Hibernate.]]>
</description>
<properties>
<maven.test.failure.ignore>true</maven.test.failure.ignore>
<spring.framework.version>3.2.3.RELEASE</spring.framework.version>
</properties>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.5.0-Final</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.framework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.framework.version}</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.3.156</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.framework.version}</version>
</dependency>
<!-- <dependency>
<groupId>hsqldb</groupId><artifactId>hsqldb</artifactId>
<version>1.8.0.10</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>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.8</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>oracle</id>
<name>ORACLE JDBCRepository</name>
<url>http://maven.jahia.org/maven2</url>
</repository>
</repositories>
</project>
3. onj.edu.hibernate.model 클래스
[MyEmp.java]
package
onj.edu.hibernate.model;
import java.io.Serializable;
import
javax.persistence.Column;
import
javax.persistence.Entity;
import javax.persistence.Id;
import
javax.persistence.Table;
//myemp 테이블의 도메인 클래스
@Entity
@Table(name="myemp")
public class MyEmp implementsSerializable{
@Column(name="empno", unique=true, nullable=false)
private Integer empno;
private String ename;
public Integer getEmpno() {
return empno;
}
public void setEmpno(Integer empno)
{
this.empno = empno;
}
public StringgetEname() {
return ename;
}
public void setEname(String ename)
{
this.ename = ename;
}
}
4. 다은은
BusinessObject 클래스를 만들자
[MyEmpBo.java]
package onj.edu.hibernate.bo;
import
onj.edu.hibernate.model.MyEmp;
public interface MyEmpBo {
//
empno를 key로 데이터 selcet
public MyEmpgetMyEmp(int empno);
//
insert
public void setMyEmp(MyEmp
myEmp);
//
update
public void updateMyEmp(MyEmp
myEmp);
//
이름으로 데이터 select
public MyEmpfindEmpByName(String
name);
}
[MyEmpBoImpl.java]
package onj.edu.hibernate.bo;
import
onj.edu.hibernate.dao.MyEmpDao;
import
onj.edu.hibernate.model.MyEmp;
importorg.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Service;
@Service("myEmpBo")
public class MyEmpBoImpl
implements MyEmpBo {
@Autowired
MyEmpDao myEmpDao;
public void setMyEmpDao(MyEmpDao myEmpDao)
{
this.myEmpDao = myEmpDao;
}
public MyEmpgetMyEmp(int empno) {
return myEmpDao.getMyEmp(empno);
}
public void setMyEmp(MyEmp myEmp)
{
myEmpDao.setMyEmp(myEmp);
}
public void updateMyEmp(MyEmp myEmp)
{
myEmpDao.updateMyEmp(myEmp);
}
public MyEmpfindEmpByName(String name)
{
return myEmpDao.findEmpByName(name);
}
}
5. Data Access Object(DAO) 관련 클래스
[MyEmpDao.java]
package
onj.edu.hibernate.dao;
import
onj.edu.hibernate.model.MyEmp;
public interface MyEmpDao {
//empno를 key로 데이터 selcet
public MyEmp getMyEmp(int empno);
//insert
public void setMyEmp(MyEmp myEmp);
//update
public void updateMyEmp(MyEmp
myEmp);
//이름으로 데이터 select
public MyEmp findEmpByName(String
name);
}
[MyEmpHibernateDaoSupport.java]
package
onj.edu.hibernate.util;
import
org.hibernate.SessionFactory;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;
//Annotation Mode에서 DAO클래스가 직접HibernateDaoSupport을 상속받는것은 불가능
//DAO에서 sessionFactory bean을 Autowired하는것은 불가능
public abstract class MyEmpHibernateDaoSupport
extends HibernateDaoSupport
{
@Autowired
public void anyMethodName(SessionFactorysessionFactory)
{
setSessionFactory(sessionFactory);
}
}
[MyEmpDaoImpl.java]
package
onj.edu.hibernate.dao;
import java.util.List;
import
onj.edu.hibernate.model.MyEmp;
importonj.edu.hibernate.util.MyEmpHibernateDaoSupport;
import
org.springframework.stereotype.Repository;
//Annotation Mode에서 DAO클래스가 직접HibernateDaoSupport을 상속받는것은 불가능
//DAO에서 sessionFactory bean을 Autowired하는것은 불가능
@Repository("myEmpDao")
public class MyEmpDaoImpl extendsMyEmpHibernateDaoSupport
implements MyEmpDao {
//아래에서 MyEmp.class는 Entity 클래스
public MyEmpgetMyEmp(int empno) {
return getHibernateTemplate().get(MyEmp.class, empno);
}
public void setMyEmp(MyEmp myEmp)
{
getHibernateTemplate().save(myEmp);
}
public void updateMyEmp(MyEmp myEmp)
{
getHibernateTemplate().update(myEmp);
}
//주의 : 아래 from절다음의 테이블명 자리에는 실제 DB테이블명이 아니라 myemp.hbm.xml 파일의 CLASS명과 속성명이 와야한다.
//대소문자 주의!! DB의 테이블명과 컬럼명이 아님.
//
public MyEmpfindEmpByName(String name)
{
List list = getHibernateTemplate().find("from MyEmp where ename =
?",
name);
return(MyEmp)list.get(0);
}
}
6. 다음은 하이버네이트 관계된 설정을 하자.
[hibernate.xml]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<!--
<propertyname="mappingResources">
<list>
<value>myemp.hbm.xml</value>
</list>
</property>
-->
<property name="annotatedClasses">
<list>
<value>onj.edu.hibernate.model.MyEmp</value>
</list>
</property>
</bean>
</beans>
7. 다음은 데이터베이스 관련 설정을 하자.
[database.properties]
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@192.168.0.7:1521:onj
jdbc.username=scott
jdbc.password=tiger
[datasource.xml]
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>database.properties</value>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
</beans>
8 .지금까지 설정한 XML
파일을모으자.
[beanlocations.xml]
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<!--
DatabaseConfiguration -->
<import resource="datasource.xml"/>
<import resource="hibernate.xml"/>
<!--Auto
scan the components -->
<context:component-scan base-package="onj.edu.hibernate.dao,onj.edu.hibernate.bo"
/>
</beans>
9. 테스트를 위한
ClientProgram
package onj.edu.hibernate.client;
import
onj.edu.hibernate.bo.MyEmpBo;
import
onj.edu.hibernate.model.MyEmp;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
public class HibernateClient
{
public static void main( String[] args
)
{
ApplicationContext appContext =
newClassPathXmlApplicationContext("beanlocations.xml");
MyEmpBo myEmpBo
=(MyEmpBo)appContext.getBean("myEmpBo");
//insert
MyEmp myEmp = new
MyEmp();
myEmp.setEmpno(59192);
myEmp.setEname("오라클자바");
myEmpBo.setMyEmp(myEmp);
//ename으로
select
MyEmp myEmp2
=myEmpBo.findEmpByName("오라클자바");
System.out.println(myEmp2);
//empno로
select
MyEmp myEmp3 =
myEmpBo.getMyEmp(59192);
System.out.println(myEmp2);
//update
myEmp3.setEname("OracleJava");
myEmpBo.updateMyEmp(myEmp3);
}
}
10. HibernateClient 를 실행
[결과’
2014-01-2612:21:45,826
INFO[org.springframework.context.support.ClassPathXmlApplicationContext]
-<Refreshingorg.springframework.context.support.ClassPathXmlApplicationContext@46a09b:startup
date [Sun Jan 26 12:21:45 KST 2014]; root of context hierarchy>
2014-01-2612:21:45,888
INFO[org.springframework.beans.factory.xml.XmlBeanDefinitionReader] -
<LoadingXML bean definitions from class path resource
[beanlocations.xml]>
2014-01-2612:21:46,013
INFO[org.springframework.beans.factory.xml.XmlBeanDefinitionReader] -
<LoadingXML bean definitions from class path resource
[datasource.xml]>
2014-01-2612:21:46,045 INFO
[org.springframework.beans.factory.xml.XmlBeanDefinitionReader]- <Loading XML
bean definitions from class path resource [hibernate.xml]>
2014-01-2612:21:46,248
INFO[org.springframework.beans.factory.config.PropertyPlaceholderConfigurer]
-<Loading properties file from class path resource
[database.properties]>
2014-01-2612:21:46,263
INFO[org.springframework.beans.factory.support.DefaultListableBeanFactory]
-<Pre-instantiating singletons
inorg.springframework.beans.factory.support.DefaultListableBeanFactory@143b598:defining
beans
[org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,dataSource,sessionFactory,myEmpDao,myEmpBo,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor];root
of factory hierarchy>
2014-01-2612:21:46,357 INFO
[org.springframework.jdbc.datasource.DriverManagerDataSource]- <Loaded JDBC
driver: oracle.jdbc.driver.OracleDriver>
2014-01-2612:21:46,404 INFO [org.hibernate.cfg.annotations.Version] -
<HibernateAnnotations 3.5.0-Final>
2014-01-2612:21:46,420 INFO [org.hibernate.cfg.Environment] -
<Hibernate3.5.0-Final>
2014-01-2612:21:46,420 INFO [org.hibernate.cfg.Environment] -
<hibernate.propertiesnot found>
2014-01-2612:21:46,435 INFO [org.hibernate.cfg.Environment] -
<Bytecode provider name: javassist>
2014-01-2612:21:46,435 INFO [org.hibernate.cfg.Environment] -
<using JDK 1.4java.sql.Timestamp handling>
2014-01-2612:21:46,513 INFO
[org.hibernate.annotations.common.Version] - <HibernateCommons Annotations
3.2.0.Final>
2014-01-2612:21:46,560 INFO [org.hibernate.cfg.AnnotationBinder] -
<Binding entityfrom annotated class:
onj.edu.hibernate.model.MyEmp>
2014-01-2612:21:46,607 INFO
[org.hibernate.cfg.annotations.EntityBinder] - <Bindentity
onj.edu.hibernate.model.MyEmp on table myemp>
2014-01-2612:21:46,638 INFO
[org.hibernate.cfg.AnnotationConfiguration] - <HibernateValidator not found:
ignoring>
2014-01-2612:21:46,638 INFO
[org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean]-
<Building new Hibernate SessionFactory>
2014-01-2612:21:46,638
INFO[org.hibernate.cfg.search.HibernateSearchEventListenerRegister] - <Unable
tofind org.hibernate.search.event.FullTextIndexEventListener on the
classpath.Hibernate Search is not enabled.>
2014-01-2612:21:46,701 INFO
[org.hibernate.connection.ConnectionProviderFactory] -<Initializing
connection
provider:org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider>
2014-01-2612:21:47,607 INFO [org.hibernate.cfg.SettingsFactory] -
<RDBMS: Oracle,version: Oracle Database 11g Enterprise Edition Release
11.2.0.1.0 - Production
With thePartitioning, OLAP, Data Mining and Real Application Testing
options>
2014-01-2612:21:47,607 INFO [org.hibernate.cfg.SettingsFactory] -
<JDBC driver: OracleJDBC driver, version:
11.1.0.7.0-Production>
2014-01-2612:21:47,623 INFO [org.hibernate.dialect.Dialect] -
<Using dialect:org.hibernate.dialect.Oracle10gDialect>
2014-01-2612:21:47,638 INFO
[org.hibernate.transaction.TransactionFactoryFactory] -<Transaction
strategy:org.springframework.orm.hibernate3.SpringTransactionFactory>
2014-01-2612:21:47,638 INFO
[org.hibernate.transaction.TransactionManagerLookupFactory] -<No
TransactionManagerLookup configured (in JTA environment, use ofread-write or
transactional second-level cache is not recommended)>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Automatic flushduring beforeCompletion(): disabled>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Automatic sessionclose at end of transaction: disabled>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<JDBC batch size:15>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<JDBC batch updatesfor versioned data: disabled>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Scrollable resultsets: enabled>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<JDBC3getGeneratedKeys(): disabled>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Connection releasemode: auto>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Default batch fetchsize: 1>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Generate SQL withcomments: disabled>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Order SQL updatesby primary key: disabled>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Order SQL insertsfor batching: disabled>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Query
translator:org.hibernate.hql.ast.ASTQueryTranslatorFactory>
2014-01-2612:21:47,638 INFO
[org.hibernate.hql.ast.ASTQueryTranslatorFactory] -
<UsingASTQueryTranslatorFactory>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Query languagesubstitutions: {}>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<JPA-QL strict compliance:disabled>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Second-level cache:enabled>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Query cache:disabled>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Cache regionfactory :
org.hibernate.cache.impl.NoCachingRegionFactory>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Optimize cache forminimal puts: disabled>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Structuredsecond-level cache entries: disabled>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Echoing all SQL tostdout>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Statistics:disabled>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Deleted entitysynthetic identifier rollback: disabled>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Defaultentity-mode: pojo>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Named querychecking : enabled>
2014-01-2612:21:47,638 INFO [org.hibernate.cfg.SettingsFactory] -
<Check Nullabilityin Core (should be disabled when Bean Validation is on):
enabled>
2014-01-2612:21:47,748 INFO [org.hibernate.impl.SessionFactoryImpl] -
<buildingsession factory>
2014-01-2612:21:47,904 INFO
[org.hibernate.impl.SessionFactoryObjectFactory] - <Notbinding factory to
JNDI, no JNDI name configured>
2014-01-2612:21:48,013 DEBUG [org.hibernate.SQL] - <insert into
myemp (ename, empno)values (?, ?)>
Hibernate: insertinto myemp (ename, empno) values (?, ?)
2014-01-2612:21:48,388 DEBUG [org.hibernate.SQL] - <select
myemp0_.empno as empno0_,myemp0_.ename as ename0_ from myemp myemp0_ where
myemp0_.ename=?>
Hibernate: selectmyemp0_.empno as empno0_, myemp0_.ename as ename0_
from myemp myemp0_ wheremyemp0_.ename=?
onj.edu.hibernate.model.MyEmp@1e8bec9
2014-01-2612:21:48,482 DEBUG [org.hibernate.SQL] - <select
myemp0_.empno as empno0_0_,myemp0_.ename as ename0_0_ from myemp myemp0_ where
myemp0_.empno=?>
Hibernate: selectmyemp0_.empno as empno0_0_, myemp0_.ename as
ename0_0_ from myemp myemp0_ wheremyemp0_.empno=?
onj.edu.hibernate.model.MyEmp@1e8bec9
2014-01-2612:21:48,545 DEBUG [org.hibernate.SQL] - <update myemp
set ename=? whereempno=?>
Hibernate: updatemyemp set ename=? where empno=?
댓글 없음:
댓글 쓰기