[스프링,하이버네이트,오라클자바커뮤니티, 스프링프레임워크]스프링, 하이버네이트애노테이션예제(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=?
댓글 없음:
댓글 쓰기