Рубрики
Без рубрики

Аннотации весенних данных

Узнайте о наиболее важных аннотациях, которые нам нужны для обработки сохраняемости с помощью проекта Spring Data

Автор оригинала: 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 MyUtilityRepository extends 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 }")
List findUsersByName(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.