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

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

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

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

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

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

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

3 ответа

Решение

Так, 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.

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

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

Другие вопросы по тегам