Чем Spring Data JPA отличается от Hibernate для крупных проектов?



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



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



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



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



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



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

733   3  

3 ответов:

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

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

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

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

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

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

Удачи.

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

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

Comments

    Ничего не найдено.