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


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

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

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

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

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

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

3 120

3 ответа:

и spring-data делает некоторые дополнительные магии, которые помогают со сложными запросами. Сначала это странно, и вы полностью пропускаете его в документах, но он действительно мощный и полезный.

это включает в себя создание пользовательского Repository и пользовательский "RepositoryImpl" и говорит Spring, где его найти. Вот пример:

класс конфигурации - пункт еще-нужны конфигурации XML с аннотацией, указывающей на ваш пакет репозиториев (он ищет *Impl классы автоматически):

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

jpa-репозитории.xml-tell 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 - где вы на самом деле реализуете эти методы с autowired 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 действительно готов к большому применению. И чем больше запросов вы можете вставить в простые или аннотации, тем лучше для вас.

все это задокументировано в весенние данные Jpa сайта.

удачи.

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

Если вы предвидите сложные запросы и чувствуете себя комфортно, используя объекты Hibernate без JPA I думаю, альтернативная комбинация может быть иметь простые весенние данные Repositorys рядом со сложными Hibernate-based с конкретными методами, которые вам могут понадобиться. Это может быть менее громоздким, что скручивание реализации 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 для получения дополнительной информации.