본문 바로가기

정리/JPA

하이버네이트, JPA

예제

  • /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>