Как Spring Data JPA отличается от Hibernate для больших проектов?

Мне сложно решить, должен ли я придерживаться Hibernate для нового проекта, или получить мои ноги влажными JPA и новой реализацией данных Spring.

Является ли инфраструктура данных Spring предназначена для больших проектов или небольших проектов со скромными требованиями к запросу?

В то время как я, безусловно, вижу преимущество в сокращении кода с помощью аннотации @Query, что вы делаете для динамических запросов? Как насчет того, когда вы хотите реализовать метод save(), который достаточно сложный?

В документации говорится о создании пользовательского интерфейса и реализации, которые реализует ваш основной репозиторий, но что делать, если вам нужно получить доступ к любым супер-методам в самом хранилище crud? Репозиторий crud реализует обычную, а не наоборот. Это кажется странным дизайном.

Я очень сомневаюсь, что эта структура будет отвечать вызовам сложных и крупных приложений. Я никогда не сталкивался со многими проблемами с Hibernate, и я подумываю о том, чтобы придерживаться старой доброй надежды, а не идти с Spring Data JPA.

Что мне делать? Какие непредвиденные осложнения и затраты я столкнусь, если я перейду с помощью Spring Data JPA?

Ответ 1

Итак, 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 - где вы фактически реализуете эти методы с помощью autwired 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.

Удачи.

Ответ 2

Я использовал Spring Data JPA в небольших и больших проектах с запросами простых запросов. Главное преимущество заключается не в том, чтобы использовать аннотацию @Query. В Spring данных нет ничего, что помешает вам использовать его в больших проектах, и недавняя поддержка QueryDSL может вам помочь. Это пример использования QueryDSL для таргетинга на спящий режим.

Если вы ожидаете сложных запросов, и вам удобнее использовать объекты Hibernate без JPA, я думаю, что альтернативной комбинацией может быть простая Spring Data Repository рядом с сложными Hibernate-системами с конкретными методами, которые могут вам понадобиться. Было бы менее громоздким, если бы скручивание реализации Hibernate в структуру Spring данных JPA.

Ответ 3

Spring JPA предоставит вам много абстракций от написания SQL и даже некоторых HQL с использованием объявления метода запроса. Spring JPA блистает своим поколением запросов, но когда вы хотите получить чисто спящий режим, вы можете настроить по мере необходимости, поскольку Spring JPA по-прежнему базируется на спящем режиме. Подробнее см. В документах http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html.