티스토리 뷰
공부/ORM, JPA, Hibernate
Change from Hibernate to JPA & Apply SpringData JPA, QueryDsl, hsqldb
doublemetal 2015. 4. 28. 22:43Hibernate -> JPA
- DB접근을 위한 interface를 sessionFactory에서 entityManagerFactory로 변경
- persistence.xml로 특정 orm의 설정을 그대로 두고 import 시키는 방식 대신 기존처럼 직접 바인딩하는 설정을 사용하였음
- 기존 GenericDao에 sessionFactory inject 대신 EntityManager를 걸어주면 되고, annotation은 @PersistenceContext를 사용한다.
- hibernate core와 사용하는 메소드명과 의미가 조금씩 다르긴 하지만, 거의 유사하다고 보면 된다.
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="packagesToScan" value="com.playsw.service"/> <property name="dataSource" ref="dataSource"/> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> </property> <property name="jpaProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> </props> </property> </bean>
SpringData JPA
- 기존의 GenericDao를 대체하고 추가적으로, 유연한 query implementation을 지원해주는 framework
- 기본적인 crud는 JpaRepository interface를 상속받는 interface를 새로 작성하는 것으로 해결된다.
- springData JPA가 구동되면서 JpaRepository를 상속받고 있는 interface를 찾아서 구현체를 만들어줌.
- 아래 설정으로 repository를 찾는다.
-><jpa:repositories base-package="targetPackage" transaction-manager-ref="transactionManager"/>
- 개발자는 interface로 메소드만 실행시키면 된다.
- 추가적인 쿼리를 만들고 싶으면 interface에 findByName <- 요런식으로 메소드명만 잘 만들어주면 된다. 문법은 문서를 참조
public interface TagRepository extends JpaRepository<Tag, Integer> {
Tag findByName(String name);
}
QueryDsl
- SpringData JPA로 커버가 되지 않는 조금은 더 복잡한 쿼리가 필요할 때 사용
- type-safe한 즉, 디버깅이 쉽고 기계의 도움을 받을 수 있는 수준의 쿼리 작성이 가능하다.
- interface에 QueryDslPredicateExecutor를 상속 받는다.
- update, delete 등의 쿼리에서 조회조건을 추가하고 싶다면?! -> QueryDslPredicateExecutor(abstract class)를 상속받아 새로운 클래스를 정의하여 사용하면 된다.
- 하다하다 안되면 native sql도 사용가능하다고 한다.
maven 플러그인 추가 후에 build하면 Q가 붙은 도메인 클래스들이 생기는데 요것들로 쿼리를 작성하게 된다.
@Test public void testBooleanBuilder() { QTag tag = QTag.tag; BooleanBuilder builder = new BooleanBuilder(); builder.and(tag.name.eq("thisIsTag")).and(tag.modr.ne("doublemetal")); List<Tag> tags = (List<Tag>) tagRepository.findAll(builder.getValue()); for (Tag obj : tags) { System.out.println(obj); } } public interface TagRepository extends JpaRepository<Tag, Integer>, QueryDslPredicateExecutor<Tag> { Tag findByName(String name); }
hsqldb
- 테스트용 메모리 DB
- 임베디드/메모리/원격 설정이 가능한데 임베디드를 사용한다.
- 테스트용 context파일을 따로 만들어서 적용하였다.
- src/test/resources 하위에 설정 파일과 실제 DB관련 파일(hsqldb폴더)이 담긴다.
- 원래 context와 설정은 동일하고 dataSource만 바꿔주면 된다.(username과 password는 고정)
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.hsqldb.jdbcDriver"/> <!--<property name="url" value="jdbc:hsqldb:mem:test"/>--> <property name="url" value="jdbc:hsqldb:file:src/test/resources/hsqldb/dummy"/> <property name="username" value="sa"/> </bean>
'공부 > ORM, JPA, Hibernate' 카테고리의 다른 글
hibernate openSessionInViewFilter (0) | 2015.05.11 |
---|---|
[When use getOne and findOne methods Spring Data JPA (0) | 2015.04.30 |
[hibernate] test rollback 문제 (0) | 2015.04.27 |
[hibernate] 자동으로 스키마 생성 (0) | 2015.04.27 |
hibernate 데이터 조회 방법 (0) | 2015.04.07 |
댓글