Автор оригинала: Attila Fejér.
1. введение
Spring Data обеспечивает абстракцию по сравнению с технологиями хранения данных. Таким образом, наш код бизнес-логики может быть гораздо более независимым от базовой реализации персистентности. Кроме того, Spring упрощает обработку зависящих от реализации деталей хранения данных.
В этом руководстве мы увидим наиболее распространенные аннотации проектов Spring Data, Spring Data JPA и Spring Data MongoDB.
2. Общие аннотации данных Весны
2.1. @Транзакционный
Когда мы хотим настроить транзакционное поведение метода , мы можем сделать это с помощью:
@Transactional void pay() {}
Если мы применим эту аннотацию на уровне класса, то она будет работать со всеми методами внутри класса. Однако мы можем переопределить его эффекты, применив его к определенному методу.
Он имеет множество параметров конфигурации, которые можно найти в этой статье .
2.2. @NoRepositoryBean
Иногда мы хотим создать интерфейсы репозиториев с единственной целью-предоставить общие методы для дочерних репозиториев .
Конечно, мы не хотим, чтобы Spring создавал боб этих репозиториев, так как мы не будем их никуда вводить. @NoRepositoryBean делает именно это: когда мы помечаем дочерний интерфейс org.springframework.data.repository.Repository , Spring не создаст из него боб.
Например, если нам нужен Необязательный метод findById(ID id) во всех наших репозиториях, мы можем создать базовый репозиторий:
@NoRepositoryBean interface MyUtilityRepositoryextends CrudRepository { Optional findById(ID id); }
Эта аннотация не влияет на дочерние интерфейсы; следовательно, Spring создаст компонент для следующего интерфейса репозитория:
@Repository interface PersonRepository extends MyUtilityRepository{}
Обратите внимание, что приведенный выше пример не является необходимым с версии Spring Data 2, которая включает в себя этот метод, заменяющий более старый T findOne(ID id) .
2.3. @Param
Мы можем передавать именованные параметры в наши запросы, используя @Param :
@Query("FROM Person p WHERE p.name = :name") Person findByName(@Param("name") String name);
Обратите внимание, что мы ссылаемся на параметр с синтаксисом :name .
Для получения дополнительных примеров, пожалуйста, посетите эту статью .
2.4. @Id
@Id отмечает поле в классе модели в качестве первичного ключа:
class Person { @Id Long id; // ... }
Поскольку он не зависит от реализации, он упрощает использование класса модели с несколькими механизмами хранения данных.
2.5. @Переходный процесс
Мы можем использовать эту аннотацию, чтобы пометить поле в классе модели как переходное. Следовательно, механизм хранения данных не будет считывать или записывать значение этого поля:
class Person { // ... @Transient int age; // ... }
Как и @Id , @Transient также не зависит от реализации, что делает его удобным для использования с несколькими реализациями хранилища данных.
2.6. @CreatedBy, @LastModifiedBy, @CreatedDate, @LastModifiedDate
С помощью этих аннотаций мы можем провести аудит наших классов моделей: Spring автоматически заполняет аннотированные поля участником, создавшим объект, последним изменившим его, датой создания и последней модификацией:
public class Person { // ... @CreatedBy User creator; @LastModifiedBy User modifier; @CreatedDate Date createdAt; @LastModifiedDate Date modifiedAt; // ... }
Обратите внимание, что если мы хотим, чтобы Spring заполнял участников, нам также нужно использовать Spring Security.
Для более подробного описания, пожалуйста, посетите эту статью .
3. Аннотации JPA весенних данных
3.1. @Запрос
С помощью @Query мы можем предоставить реализацию JPQL для метода репозитория:
@Query("SELECT COUNT(*) FROM Person p") long getPersonCount();
Кроме того, мы можем использовать именованные параметры:
@Query("FROM Person p WHERE p.name = :name") Person findByName(@Param("name") String name);
Кроме того, мы можем использовать собственные SQL-запросы, если мы установим аргумент native Query в true :
@Query(value = "SELECT AVG(p.age) FROM person p", nativeQuery = true) int getAverageAge();
Для получения дополнительной информации, пожалуйста, посетите эту статью .
3.2. Процедура @
С помощью Spring Data JPA мы можем легко вызывать хранимые процедуры из репозиториев.
Во-первых, нам нужно объявить репозиторий в классе сущностей, используя стандартные аннотации JPA:
@NamedStoredProcedureQueries({ @NamedStoredProcedureQuery( name = "count_by_name", procedureName = "person.count_by_name", parameters = { @StoredProcedureParameter( mode = ParameterMode.IN, name = "name", type = String.class), @StoredProcedureParameter( mode = ParameterMode.OUT, name = "count", type = Long.class) } ) }) class Person {}
После этого мы можем ссылаться на него в репозитории с именем, которое мы объявили в аргументе name :
@Procedure(name = "count_by_name") long getCountByName(@Param("name") String name);
3.3. @Lock
Мы можем настроить режим блокировки при выполнении метода запроса репозитория:
@Lock(LockModeType.NONE) @Query("SELECT COUNT(*) FROM Person p") long getPersonCount();
Доступные режимы блокировки:
- ЧИТАТЬ
- ПИСАТЬ
- ОПТИМИСТИЧНЫЙ
- OPTIMISTIC_FORCE_INCREMENT
- PESSIMISTIC_READ
- PESSIMISTIC_WRITE
- PESSIMISTIC_FORCE_INCREMENT
- НИКТО
3.4. @Изменение
Мы можем изменять данные с помощью метода репозитория, если мы аннотируем их с помощью @Modifying :
@Modifying @Query("UPDATE Person p SET p.name = :name WHERE p.id = :id") void changeName(@Param("id") long id, @Param("name") String name);
Для получения дополнительной информации, пожалуйста, посетите эту статью .
3.5. @EnableJpaRepositories
Чтобы использовать репозитории JPA, мы должны указать его в Spring. Мы можем сделать это с помощью @EnableJpaRepositories.
Обратите внимание, что мы должны использовать эту аннотацию с @Configuration :
@Configuration @EnableJpaRepositories class PersistenceJPAConfig {}
Spring будет искать репозитории в подпакетах этого класса @Configuration .
Мы можем изменить это поведение с помощью аргумента base Packages :
@Configuration @EnableJpaRepositories(basePackages = "com.baeldung.persistence.dao") class PersistenceJPAConfig {}
Также обратите внимание, что Spring Boot делает это автоматически, если находит Spring Data JPA в пути к классу.
4. Весенние данные Mongo Аннотации
Весенние данные значительно облегчают работу с MongoDB. В следующих разделах мы рассмотрим наиболее основные функции Spring Data MongoDB.
Для получения дополнительной информации, пожалуйста, посетите нашу статью о Spring Data MongoDB .
4.1. @Документ
Эта аннотация помечает класс как объект домена, который мы хотим сохранить в базе данных:
@Document class User {}
Это также позволяет нам выбрать название коллекции, которую мы хотим использовать:
@Document(collection = "user") class User {}
Обратите внимание, что эта аннотация является эквивалентом монго @Entity в JPA.
4.2. Поле @
С помощью @Field мы можем настроить имя поля , которое мы хотим использовать, когда MongoDB сохранит документ:
@Document class User { // ... @Field("email") String emailAddress; // ... }
Обратите внимание, что эта аннотация является эквивалентом монго @Column в JPA.
4.3. @Запрос
С помощью @Query мы можем предоставить запрос finder для метода репозитория MongoDB:
@Query("{ 'name' : ?0 }") ListfindUsersByName(String name);
4.4. @EnableMongoRepositories
Чтобы использовать репозитории MongoDB, мы должны указать его на Spring. Мы можем сделать это с помощью @EnableMongoRepositories.
Обратите внимание, что мы должны использовать эту аннотацию с @Configuration :
@Configuration @EnableMongoRepositories class MongoConfig {}
Spring будет искать репозитории в подпакетах этого класса @Configuration . Мы можем изменить это поведение с помощью аргумента base Packages :
@Configuration @EnableMongoRepositories(basePackages = "com.baeldung.repository") class MongoConfig {}
Также обратите внимание, что Spring Boot делает это автоматически, если находит Spring Data MongoDB в пути к классу.
5. Заключение
В этой статье мы рассмотрели, какие наиболее важные аннотации нам нужны для работы с данными в целом, используя Spring. Кроме того, мы рассмотрели наиболее распространенные аннотации JPA и MongoDB.
Как обычно, примеры доступны на GitHub здесь для общих аннотаций и аннотаций JPA и здесь для аннотаций MongoDB.