Чем 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 для получения дополнительной информации.