Spring Data JPA는 대규모 프로젝트에서 Hibernate와 어떻게 다릅니 까?


129

새로운 프로젝트를 위해 Hibernate를 고수해야하는지, JPA와 새로운 Spring Data 구현으로 발을 젖게해야할지 결정하기가 힘들다.

Spring Data 프레임 워크는 규모가 작은 쿼리 요구 사항이있는 대규모 프로젝트 또는 소규모 프로젝트를위한 것입니까?

@Query주석 을 사용하여 코드 축소의 장점을 확실히 알지만 동적 쿼리에는 어떤 작업을 수행합니까? 꽤 복잡한 save () 메소드를 구현하려고 할 때 어떻습니까?

이 문서는 메인 리포지토리가 구현하는 사용자 정의 인터페이스 및 구현을 작성한다고 말하지만 crud 리포지토리 자체의 수퍼 메소드에 액세스해야하는 경우 어떻게해야합니까? crud 저장소는 다른 방법이 아닌 사용자 정의를 구현합니다. 이상한 디자인 인 것 같습니다.

이 프레임 워크가 복잡하고 큰 응용 프로그램의 문제를 해결할 수 있을지 잘 모르겠습니다. 나는 최대 절전 모드와 관련하여 많은 문제를 겪어 본 적이 없으며 Spring Data JPA가 아닌 오래되고 신뢰할만한 것을 고수하는 것을 고려하고 있습니다.

어떻게해야합니까? Spring Data JPA를 사용하면 예상치 못한 합병증과 비용이 발생합니까?


1
내가 아는 한 거의 차이가 없습니다. 더 편한 사람과 함께 가십시오. 왜 토론인가?
duffymo

1
나는 분명히 최대 절전 모드에 더 익숙하지만 동일한 작업을 수행하고 생산성을 높이려면 새로운 접근법을 채택하고 싶습니다. 그러나 최대 절전 모드가 여전히 더 강력하고 문제가 훨씬 적 으면 내가 알고 싶은 것입니다.
egervari

3
JPA는 Hibernate를 여러 구현 중 하나로 사용하는 ORM의 일반화입니다. 당신은 어떤 힘을 다른 사람에게 부여하고 있습니까? JPA는 표준이지만 둘 사이의 차이는 거의 없습니다. 완전한 공개를 위해, 나는 어느 쪽도 신경 쓰지 않는다고 말할 것입니다. 둘 다 SQL을 생성합니다. 차라리 직접 쓰겠습니다. ORM은 모든 문제와 모든 사용자를위한 것은 아닙니다.
duffymo

1
나는 동의한다. JPA 또는 최대 절전 모드에서만 올 때마다 최대 절전 모드를 선택합니다. 솔직히 JPA 구현 자체를 좋아하지 않습니다. IDEA의 IDE 지원은 실제로는 여전히 좋지 않으며 단위 테스트를 실행하는 대신 응용 프로그램을 시작할 때 매핑이 올바르지 않은 경우 불평합니다. JPA와 함께하는 다른 많은 이쑤시개가 있습니다. 나는 실제로 오래된 Hibernate XML 매핑 파일을 즐긴다. 내 오브젝트도 훨씬 덜 복잡하게 보이게하는 이점이 있습니다. Spring Data JPA는 많은 새로운 기능을 제공하므로 마침내 전환 할 가치가 있는지 궁금했습니다.
egervari

3
"스프링 데이터"는 JPA의 구현 또는 그 밖의 것이 아닙니다. 단순히 기존 JPA 구현을 취하고 제공하는 것을 단순화합니다. JPA 구현은 여전히 ​​모든 작업을 수행합니다.
Neil Stockton

답변:


104

그래서, spring-data 복잡한 쿼리에 도움이 몇 가지 추가 마법을 수행합니다. 처음에는 이상하고 문서에서 완전히 건너 뛰지 만 실제로 강력하고 유용합니다.

사용자 정의 작성이 포함됩니다. Repository 과 커스텀`RepositoryImpl '을 생성하고 Spring에게 그것을 어디로 찾아야하는지 알려준다. 예를 들면 다음과 같습니다.

구성 클래스- 리포지토리 패키지를 가리키는 주석이있는 여전히 필요한 xml 구성 을 가리 킵니다 ( *Impl지금 자동으로 클래스를 찾습니다 ).

@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}

jpa-repositories.xml-리포지토리 Spring를 찾을 위치를 알려줍니다 . 또한 파일 이름 Spring이있는 사용자 정의 저장소를 찾 도록 지시 CustomImpl하십시오.

<?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" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<jpa:repositories base-package="com.example.repositories" repository-impl-postfix="CustomImpl" />

</beans>

MyObjectRepository-주석을 달고 주석이없는 쿼리 메소드를 넣을 수있는 곳입니다. 이 저장소 인터페이스가 다음을 어떻게 확장하는지 참고하십시오 Custom.

@Transactional
public interface MyObjectRepository extends JpaRepository<MyObject, Integer>, MyObjectRepositoryCustom {

    List<MyObject> findByName(String name);

    @Query("select * from my_object where name = ?0 or middle_name = ?0")
    List<MyObject> findByFirstNameOrMiddleName(String name);
}

MyObjectRepositoryCustom -더 복잡하고 간단한 쿼리 나 주석으로 처리 할 수없는 저장소 메소드 :

public interface MyObjectRepositoryCustom {

    List<MyObject> findByNameWithWeirdOrdering(String name);
}

MyObjectRepositoryCustomImpl-실제로 자동 유선으로 해당 메소드를 구현하는 위치 EntityManager:

public class MyObjectRepositoryCustomImpl implements MyObjectRepositoryCustom {

    @Autowired
    private EntityManager entityManager;

    public final List<MyObject> findByNameWithWeirdOrdering(String name) {
        Query query = query(where("name").is(name));
        query.sort().on("whatever", Order.ASC);
        return entityManager.find(query, MyObject.class);
    }
}

놀랍게도, 이것은 모두 함께 제공되며 두 인터페이스 (및 구현 한 CRUD 인터페이스)의 메소드는 모두 다음과 같이 표시됩니다.

myObjectRepository.

당신은 볼 것이다 :

myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()

실제로 작동합니다. 그리고 쿼리를위한 하나의 인터페이스를 얻습니다.spring-data실제로 큰 응용 프로그램을 사용할 준비가되었습니다. 그리고 더 많은 쿼리를 단순 또는 주석으로 푸시 할 수있는 것이 좋습니다.

이 모든 것은 Spring Data Jpa 사이트에 문서화되어 있습니다. .

행운을 빕니다.


4
이것은 실제로 내가 시도한 것이며 어느 정도 작동합니다. 내가 가진 문제는 save ()를 재정의하려는 경우 어떻게됩니까? 예를 들어, 블로그를 저장하고 있으며 서비스에 배치하는 것이 가장 의미가 없으므로 save () 메소드에서 이와 관련된 태그를 처리 / 저장하려고한다고 가정하십시오. 이것은 원시 Hibernate로는 쉽지만 Spring JPA와는 좋은 방법을 보지 못합니다. 답변이 정확하기 때문에 귀하의 답변을 정확한 것으로 표시하겠습니다. 기본적으로 Spring Data JPA로 할 수있는 작업입니다. 그래도 최대 절전 모드를 사용한다고 생각합니다. 이 답변은 분명히 다른 사람들을 도울 것입니다.
egervari

8
당신은 당신 자신의 JpaRepository-> 구현할 수 있습니다 MyJpaRepository. 또한을 만들어야 MyJpaRepositoryFactoryBean하지만 모두 올바르게 설정하면 .save () 메서드를 재정의 할 수 있습니다. 다음은 스프링 데이터 JPA 문서입니다. static.springsource.org/spring-data/data-jpa/docs/current/… 아직 포기하지 마십시오!
sbzoom

@Picrochole '더 낮은 계층의 응용 프로그램'을 어떻게 해석합니까? DAO를 호출하는 서비스가 더 낮은 계층입니까?
Rumid

12

간단한 쿼리 요구로 크고 작은 프로젝트에서 Spring Data JPA를 사용했습니다. 주요 이점은 @Query주석 을 사용할 필요가 없다는 것 입니다. Spring Data에는 대규모 프로젝트에서 사용하지 못하게하는 최신 정보가 없으며 최근 QueryDSL지원이 도움이 될 수 있습니다. 이것은 QueryDSL 을 사용 하는 예 입니다 을 Hibernate를 대상으로 .

복잡한 쿼리를 예상하고 JPA없이 Hibernate 객체를 사용하는 것이 편안하다고 생각한다면 대안적인 조합은 Repository복잡한 Hibernate 기반 객체 옆에 간단한 Spring Data를 필요한 특정 방법으로 가질 수 있다고 생각합니다. Hibernate 구현을 Spring Data JPA 구조로 바꾸는 것이 덜 번거로울 수 있습니다.


2
같은 프로젝트에서 혼합하고 일치시키는 대신 쿼리에 동일한 일관된 API를 사용하고 싶다고 생각합니다. 나는 여전히 복잡한 스프링 데이터 jpa에 대한 좋은 해결책을 찾지 못했으며, 일반적으로 jpa에는 꽤 많은 nitpicks가 있기 때문에 내 동면으로 최대 절전 모드를 받아들이는 것이 더 행복 할 것이라고 생각합니다. 복잡한 쿼리가 많을 것이고 40/60 혼합을 감당할 수 없습니다. 그것은 나에게 가치가 없다 :(
egervari

1
Spring Data없이 Querydsl을 직접 사용할 수도있어 JPA 위에 강력한 단일 쿼리 계층을 제공합니다.
Timo Westkämper

4

Spring JPA는 쿼리 메소드 선언을 사용하여 SQL 및 일부 HQL을 작성함으로써 많은 추상화를 제공합니다. Spring JPA는 쿼리 생성으로 빛나지 만 순수한 최대 절전 모드 솔루션을 원할 때 스프링 JPA가 여전히 최대 절전 모드를 기반으로하므로 필요에 따라 사용자 정의 할 수 있습니다. 자세한 정보는 http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html 문서를 확인하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.