Spring Data Annotations

Spring Data Annotations

1. Вступление

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

В этом руководстве мы увидим наиболее распространенные аннотации проектов Spring Data, Spring Data JPA и Spring Data MongoDB.

2. Общие весенние аннотации данных

2.1. @Transactionalс

Когда мы хотимconfigure the transactional behavior of a method, мы можем сделать это с помощью:

@Transactional
void pay() {}

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

Он имеет множество параметров конфигурации, которые можно найти вthis article.

2.2. @NoRepositoryBeanс

Sometimes we want to create repository interfaces with the only goal of providing common methods for the child repositories.

Конечно, мы не хотим, чтобы Spring создавал bean-компонент из этих репозиториев, поскольку мы не будем никуда внедрять их. @NoRepositoryBean  делает именно это: когда мы помечаем дочерний интерфейсorg.springframework.data.repository.Repository, Spring не создаст из него bean-компонент.

Например, если нам нужен методOptional<T> findById(ID id)  во всех наших репозиториях, мы можем создать базовый репозиторий:

@NoRepositoryBean
interface MyUtilityRepository extends CrudRepository {
    Optional findById(ID id);
}

Эта аннотация не влияет на дочерние интерфейсы; следовательно, Spring создаст bean-компонент для следующего интерфейса репозитория:

@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 .

Чтобы увидеть другие примеры, посетитеthis article.

2.4. @Idс

@Id помечает поле в классе модели как первичный ключ:

class Person {

    @Id
    Long id;

    // ...

}

Поскольку он не зависит от реализации, он упрощает использование класса модели с несколькими механизмами хранения данных.

2.5. @Transientс

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

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.

Для более подробного описания посетитеthis article.

3. Spring Data JPA Аннотации

3.1. @Queryс

С помощью@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-запросы, если мы установим саргументnativeQuery наtrue:

@Query(value = "SELECT AVG(p.age) FROM person p", nativeQuery = true)
int getAverageAge();

Для получения дополнительной информации посетитеthis article.

3.2. @Procedureс

С помощью 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();

Доступные режимы блокировки:

  • READ

  • ЗАПИСЫВАТЬ

  • ОПТИМИСТИЧНЫЙ

  • OPTIMISTIC_FORCE_INCREMENT

  • PESSIMISTIC_READ

  • PESSIMISTIC_WRITE

  • PESSIMISTIC_FORCE_INCREMENT

  • NONE

3.4. @Modifyingс

Мы можем изменить данные с помощью метода репозитория, если мы аннотируем их@Modifying:

@Modifying
@Query("UPDATE Person p SET p.name = :name WHERE p.id = :id")
void changeName(@Param("id") long id, @Param("name") String name);

Для получения дополнительной информации посетитеthis article.

3.5. @EnableJpaRepositoriesс

Чтобы использовать репозитории JPA, мы должны указать это Spring. Мы можем сделать это с помощью@EnableJpaRepositories.

Обратите внимание, что мы должны использовать эту аннотацию с@Configuration:

@Configuration
@EnableJpaRepositories
class PersistenceJPAConfig {}

Spring будет искать репозитории во вложенных пакетах этого класса@Configuration .

Мы можем изменить это поведение с помощью аргументаbasePackages :

@Configuration
@EnableJpaRepositories(basePackages = "org.example.persistence.dao")
class PersistenceJPAConfig {}

Также обратите внимание, что Spring Boot делает это автоматически, если находит Spring Data JPA на пути к классам.

4. Spring Data Mongo Аннотации

Spring Data значительно облегчает работу с MongoDB. В следующих разделах мы рассмотрим самые основные функции Spring Data MongoDB.

Для получения дополнительной информации посетите нашarticle about Spring Data MongoDB.

4.1. @Documentс

Эта аннотация помечает класс как объект домена, который мы хотим сохранить в базе данных:

@Document
class User {}

Это также позволяет нам выбрать название коллекции, которую мы хотим использовать:

@Document(collection = "user")
class User {}

Обратите внимание, что эта аннотация является монго-эквивалентом@Entity in JPA.

4.2. @Fieldс

С помощью@Field мы можем настроить имя поля, которое мы хотим использовать, когда MongoDB сохраняет документ:

@Document
class User {

    // ...

    @Field("email")
    String emailAddress;

    // ...

}

Обратите внимание, что эта аннотация является монго-эквивалентом@Column in JPA.

4.3. @Queryс

С помощью@Query мы можем предоставить поисковый запрос для метода репозитория MongoDB:

@Query("{ 'name' : ?0 }")
List findUsersByName(String name);

4.4. @EnableMongoRepositoriesс

Чтобы использовать репозитории MongoDB, мы должны указать это Spring. Мы можем сделать это с помощью@EnableMongoRepositories.

Обратите внимание, что мы должны использовать эту аннотацию с@Configuration:

@Configuration
@EnableMongoRepositories
class MongoConfig {}

Spring будет искать репозитории во вложенных пакетах этого класса@Configuration . Мы можем изменить это поведение с помощью аргументаbasePackages :

@Configuration
@EnableMongoRepositories(basePackages = "org.example.repository")
class MongoConfig {}

Также обратите внимание, что Spring Boot делает это автоматически, если находит Spring Data MongoDB в пути к классам.

5. Заключение

В этой статье мы увидели, какие наиболее важные аннотации нам нужны для работы с данными в целом, используя Spring. Кроме того, мы рассмотрели наиболее распространенные аннотации JPA и MongoDB.

Как обычно, примеры доступны на GitHubhere для общих аннотаций и аннотаций JPA иhere для аннотаций MongoDB.