Hibernate
http://wiki.gurubee.net/pages/viewpage.action?pageId=26741439
(하이버네이트, 스프링프레임워크 버전 차이에서 발생한 에러 :
http://stackoverflow.com/questions/22115721/spring-and-hibernate-4-get-is-not-valid-without-active-transaction)
예제
- /moronica/src/main/resources/config/context/context-datasource.xml
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@url:1521:sid" />
<property name="username" value="아이디" />
<property name="password" value="패스워드" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>config/sample.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
<prop key="show_sql">true</prop>
<prop key="hbm2ddl.auto">update</prop>
</props>
</property>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</bean>
- /moronica/src/main/resources/config/sample.xml
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="kr.co.moronica.sample.domain.Sample" table="EP_SAMPLE">
<id name="sampleId" column="SAMPLE_ID" type="java.lang.String" />
<property name="sampleName" column="SAMPLE_NAME" type="java.lang.String" not-null="false" />
</class>
</hibernate-mapping>
- /moronica/pom.xml
<!-- 3.2.9 버전에서는 하이버네이트 오류 발생. -->
<spring.maven.artifact.version>4.1.7.RELEASE</spring.maven.artifact.version>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.maven.artifact.version}</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>sun.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.10.Final</version>
</dependency>
/moronica/src/test/java/kr/co/moronica/sample/TestSampleService.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:webapp/WEB-INF/classes/config/servlet/common-*.xml",
"file:webapp/WEB-INF/classes/config/context/context-*.xml"})
public class TestSampleService {
@Resource(name = "sessionFactory")
private SessionFactory sessionFactory;
@Test
public void test() {
Sample sample = new Sample();
sample.setSampleId("sampleId02");
sample.setSampleName("sampleName02");
Session session = sessionFactory.openSession();
session.save(sample);
session.flush();
}
}
JPA
- /moronica/src/main/resources/config/context/context-springdata.xml
- repository 스캔 경로 설정.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
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
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd">
<jpa:repositories base-package="kr.co.moronica.sample.repository"></jpa:repositories>
</beans>
- /moronica/src/main/resources/config/context/context-hibernate.xml
- 하이버네이트 설정.
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<!-- 컨테이너가 관리하는 EntityManager 생성, @PersistenceContext와 함께 사용 -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 어노테이션 매핑정보 스캔 -->
<property name="packagesToScan" value="kr.co.moronica.sample.domain" />
<!-- 구현체별 자체 기능을 표준화 -->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
</bean>
</property>
<!-- persistence.xml 설정정보와 함께 사용가능 -->
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.use_sql_comments">true</prop>
<prop key="hibernate.jdbc.batch_size">5</prop>
</props>
</property>
</bean>
<!-- @PersistenceContext 스캔 및 예외변환 후처리기 -->
<context:annotation-config />
<!-- <bean id="persistenceExceptionTranslationPostProcessor" class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> -->
</beans>
- /moronica/src/main/resources/config/context/context-transaction.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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<!-- @Transactional 스캔 -->
<tx:annotation-driven />
</beans>
- /moronica/pom.xml
- 하이버네이트 + JPA 사용에 필요한 라이브러리.
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.10.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.10.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.8.1.RELEASE</version>
</dependency>
- /moronica/src/main/java/kr/co/moronica/sample/domain/Sample.java
- Sample 도메인
package kr.co.moronica.sample.domain;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Data;
@Data
@Entity(name = "Sample")
@Table(name = "EP_SAMPLE")
public class Sample implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "SAMPLE_ID")
String sampleId;
@Column(name = "SAMPLE_NAME")
String sampleName;
}
- /moronica/src/main/java/kr/co/moronica/sample/repository/SampleRepository.java
- repository 설정.
package kr.co.moronica.sample.repository;
import kr.co.moronica.sample.domain.Sample;
import org.springframework.data.jpa.repository.JpaRepository;
public interface SampleRepository extends JpaRepository<Sample, String> {
}
- /moronica/src/main/java/kr/co/moronica/sample/service/SampleService.java
- /moronica/src/main/java/kr/co/moronica/sample/service/impl/SampleServiceImpl.java
- sample 서비스 로직.
package kr.co.moronica.sample.service.impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import kr.co.moronica.sample.domain.Sample;
import kr.co.moronica.sample.repository.SampleRepository;
import kr.co.moronica.sample.service.SampleService;
@Service("sampleService")
public class SampleServiceImpl implements SampleService {
@Resource(name = "sampleRepository")
private SampleRepository sampleRepository;
public void saveSample(Sample sample) {
sampleRepository.save(sample);
}
}
QueryDSL
- eclipse.ini 에 추가.
-vm
C:\hm\tools\jdk1.7.0_79\bin\javaw.exe
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>3.6.7</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>3.6.7</version>
</dependency>