새로운 프로젝트를 위해 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 문서를 확인하십시오 .