2014-01-07 1 views
6

Я пытаюсь обернуть голову вокруг JPA и узнал совсем немного. JPA - спецификация java, и провайдеры реализуют эту спецификацию. Я понимаю эту часть.Как данные Spring (JPA) относятся к поставщикам персистентности JPA?

Что я не понимаю, так это то, как данные Spring попадают в картину. Является ли Spring Data также поставщиком, подобным Hibernate или OpenJPA? Если нет, то что это? Как Spring Data «упрощает»?

+0

Вы спрашиваете о Spring Data JPA? – dhamibirendra

+0

yea this spring data jpa: http://projects.spring.io/spring-data-jpa/ – user1099123

+0

Spring Data JPA автоматически реализует общие методы доступа к данным JPA для вас, основанные только на объектах Entity. Он основан на реляционном сопоставлении объектов Grails (GORM) и использует те же соглашения. Имена автоматически созданных методов также описывают, как вернется метод. Если у вас есть объект Foo с панелью свойств и вы хотите найти все Foos определенного бара, вы просто вызываете автоматически созданный метод Foo.findByBar(). Предположим, у Foo есть свойство dateCreated, и вы хотите найти все созданные Foos в определенный таймфрейм, использовать Foo.findByDateCreatedBetween (firstDate, secondDate) –

ответ

2

Подумайте о данных Spring как о способе поддержки JPA и многих других моделей персистентности таким образом, чтобы он был прозрачным для вашего собственного кода. Spring Data упрощает управление несколькими типами систем источников данных в унифицированном интерфейсе. Без Spring Data вам нужно будет ввести больше адаптеров в свой код, каждый раз, когда вам придется иметь дело с дополнительной логикой.

12

проект The Spring Data в целом является зонтичным проектом со следующей миссией:

... обеспечить знакомую и единообразную Spring на основе модели программирования, сохраняя при этом хранить специфические функции и возможность.

Таким образом, мы приближаемся к пространству сохранения в целом, а не только к реляционным данным через JPA. Важная часть здесь два раза:

  1. модель программирования вместо общего API
  2. Поддержка магазина особенности

Поскольку пространство для доступа к данным настолько многообразные в эти дни, пытаясь приблизиться все магазины с единым унифицирующим API обречены на провал. В конечном итоге вы получите наименьший общий знаменатель, который скрывает определенные части магазина - в тех случаях, когда вы выборочно выбираете конкретный магазин , потому что его особенностей. Абстрагирование этих сторон полностью подрывает это. На наш взгляд, особенно попытка использования JPA является неправильной, поскольку она глубоко связана с реляционными концепциями (, объединениями, транзакциями) по определению.

Тем не менее, вы не хотите работать с совершенно разными API-интерфейсами, не хотите потерять различия в хранении, если работаете с несколькими или переключаетесь с одного проекта на другой. Весна традиционно помогала в этом отношении, охватывая согласованную модель программирования, в которой есть абстракции, которые работают одинаково, но все же специфичны для конкретной технологии. Например, JDBC и JMS - это совершенно разные технологии. Spring предлагает как JdbcTemplate, так и JmsTemplate, которые отвечают тем же обязанностям (управление ресурсами и перевод исключений) и уменьшают кривую обучения при переходе от JDBC к JMS или наоборот.

Spring Data берет на себя это, раскрывая специфику магазина, используя абстракции, которые знают разработчики Spring. Я уже упоминал шаблон, но также включает общие механизмы конфигурации (пространства имен XML, используя DI и AOP и т. Д.).

Хранилища

Самый верхний слой этой модели программирования является хранилищем абстракции. В своей основе он значительно упрощает разработку уровней доступа к данным, позволяя вам избежать необходимости писать больше кода реализации, чем это необходимо. Он предоставляет функции CRUD из коробки, разбивки на страницы, а также декларативные методы запросов.

Предположите Customer класс домена.Включение упорства для него это всего лишь вопрос того, чтобы объявить репозиторное интерфейс, как это:

interface CustomerRepository extends PagingAndSortingRepository<Customer, Long> { 

    List<Customer> findByLastnameContaining(String lastname); 
} 

Теперь это вопрос конфигурации (и отображение домена класса), чтобы иметь возможность создать экземпляр этого интерфейса и использовать его из клиент. PagingAndSortingRepository включает в себя базовую функциональность CRUD, а также такие вещи, как Page<Customer> findAll(Pageable pageable) (поэтому по каждому доступ к странице). Как вы можете видеть, мы также поддерживаем механизм вывода запроса, чтобы избежать необходимости писать код реализации для простых запросов. Для более сложных мы разрешаем объявление вручную (например, используя метод @Query) или даже ручную реализацию, если это необходимо.

Приятный побочный эффект здесь заключается в том, что с помощью флип-переключателя в конфигурации вы можете использовать один и тот же интерфейс репозитория для сохранения Customer экземпляров в MongoDB. Это не означает, что мы рекомендуем слепо перемещаться из одного магазина в другой, поскольку магазины обычно требуют, чтобы модель данных была адаптирована для эффективной работы. Однако он позволяет разработчикам быстро переключаться между проектами, работающими с разными магазинами, поскольку репозитории работают одинаково (реализуя модель программирования по общему API-интерфейсу).

Специфические JPA

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

+0

Подробный ответ, но он не отвечает на фундаментальный вопрос: «Является ли Spring Data JPA провайдером, или это слой над JPA, который по-прежнему требует провайдера (OpenJPA, Hibernate, EclipseLink и т. Д.) Под ним?» –

+1

Вы прочитали последний абзац? ;) –