Чим Спільна інформація JPA відрізняється від сплячої для великих проектів?


129

Мені важко вирішити, чи варто дотримуватися режиму сплячки для нового проекту, чи змочу ноги від JPA та нової реалізації Весняних даних.

Чи призначена рамка Spring Data для великих проектів чи малих проектів зі скромними вимогами до запитів?

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

У документації написано, щоб створити користувальницький інтерфейс та реалізацію, яку реалізує ваш основний репозиторій, але що робити, якщо вам потрібно отримати доступ до будь-яких супер-методів у самому сховищі грубих файлів? Грубе сховище реалізує користувацьке одне, а не навпаки. Це здається дивним дизайном.

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

Що я повинен зробити? З якими непередбаченими ускладненнями та витратами у мене виникне, якщо я перейду до Spring Data JPA?


1
Наскільки я знаю, це мало має значення. Ідіть з тим, кому вам зручніше. Чому дебати?
duffymo

1
Мені, очевидно, набагато комфортніше зі сплячим режимом, але якщо я можу робити те ж саме і бути більш продуктивним, я вважаю за краще застосувати новіші підходи. Однак якщо сплячий режим все-таки потужніший, і я зіткнуся з набагато меншими проблемами, то я хотів би знати про це.
egervari

3
JPA - це узагальнення ORM, яке використовує Hibernate як одну з багатьох реалізацій. Які повноваження ви приписуєте один одному? JPA - це стандарт, але я бачу різницю між ними. На користь повного розкриття інформації я скажу, що я не дбаю ні про одне. Обидва генерують для вас SQL. Я б краще написав це сам. ORM не для кожної проблеми та кожного користувача.
duffymo

1
Я згоден. Якщо мова йде лише про JPA або Hibernate, я б вибирав Hibernate кожного разу. Я, чесно кажучи, не дуже люблю реалізацію СВП сама по собі. Підтримка IDE в IDEA насправді все-таки погана, і вона скаржиться, якщо відображення невірно, коли програма починається, а не дозволять одиничним тестам. У JPA у мене дуже багато інших ніттиків. Насправді мені подобаються старі файли зіставлення зі сплячим XML. Це має перевагу в тому, що мої предмети виглядають набагато менш захаращеними. Spring Data JPA пропонує багато нових функцій, тому мені нарешті було цікаво, чи варто його переключити.
egervari

3
"Весняні дані" - це не реалізація JPA, або щось інше. Він просто займає існуючу реалізацію JPA та спрощує те, що ви їй надаєте. Реалізація JPA все ще виконує всю роботу під прикриттями
Ніл Стоктон

Відповіді:


104

Отже, 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 .

Удачі.


4
Це насправді те, що я спробував, і це працює певною мірою. Проблема, яку я мав, полягає в тому, що, якщо ви хочете змінити збереження ()? Наприклад, уявіть, що ви зберігаєте блог, і ви хочете обробити / зберегти пов’язані з ним теги методом save (), оскільки введення його в сервіс не має найбільшого сенсу. Це легко зробити із сирою сплячкою, але я не бачу хорошого способу зробити це з весняною JPA. Я відзначу вашу відповідь правильною, хоча тому, що вона правильна. Це в основному те, що ви можете зробити з Spring Data JPA. Я думаю, що я буду дотримуватися режиму сплячки. Ця відповідь, безумовно, допоможе іншим.
egervari

8
Ви можете реалізувати свій власний JpaRepository-> MyJpaRepository. Ви також повинні створити, MyJpaRepositoryFactoryBeanале якщо ви все налаштували правильно, ви можете перекрити метод .save (). Ось Документи JPA для весняних даних: static.springsource.org/spring-data/data-jpa/docs/current/… Не покидайте поки що!
sbzoom

@Picrochole як ви інтерпретуєте "нижчий рівень програми"? Чи нижча за рівнем обслуговування, яка викликає DAO?
Румід

12

Я використовував Spring Data JPA у малих та великих проектах із простими запитами на запити. Основна перевага полягає в тому, що навіть не потрібно використовувати @Queryанотацію. У Spring Data немає нічого, що не заважає вам використовувати його у великих проектах, і нещодавня QueryDSLпідтримка може допомогти вам. Це приклад використання QueryDSL для націлювання на сплячий режим.

Якщо ви передбачаєте складні запити і вам комфортно користуватися об’єктами сплячки без JPA, я думаю, що альтернативною комбінацією може бути прості весняні дані Repositoryпоруч із складними, що базуються на сплячому режимі, з певними методами, які можуть вам знадобитися. Можливо, менш громіздким буде скручування в режимі сплячого режиму до структури JPA Spring Data.


2
Думаю, я б скоріше використовував ті самі послідовні api для запитів, а не змішування та зіставлення в одному проекті. Я все ще не знайшов хорошого рішення для складних весняних даних jpa-даних, і оскільки у мене в цілому досить багато ніттиків з jpa, я думаю, що я можу просто щасливіше прийняти сплячку як свою орму. У мене буде багато складних запитів, і я не можу дозволити собі суміш 40/60. Мені це не варто :(
egervari

1
Ви також можете використовувати Querydsl безпосередньо без Spring Data, що дає вам єдиний потужний шар запиту поверх JPA.
Тімо Весткампер

4

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.