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

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

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

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

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

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

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



답변

그래서, 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 사이트에 문서화되어 있습니다. .

행운을 빕니다.


답변

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

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


답변

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


답변