Анотации на пролетни данни

Тази статия е част от поредица: • Spring Core Annotations

• Пролетни уеб анотации

• Анотации на пролетното зареждане

• Анотации за пролетно планиране

• Анотации на пролетни данни (текуща статия) • Анотации на пролетния боб

1. Въведение

Spring Data осигурява абстракция над технологиите за съхранение на данни. Следователно, нашият бизнес логически код може да бъде много по-независим от основната реализация на постоянство. Също така, Spring опростява обработката на зависими от изпълнението подробности за съхранението на данни.

В този урок ще видим най-често срещаните анотации на проектите Spring Data, Spring Data JPA и Spring Data MongoDB.

2. Анотации на общи пролетни данни

2.1. @Transactional

Когато искаме да конфигурираме транзакционното поведение на метод , можем да го направим с:

@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 маркира поле в клас модел като първичен ключ:

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. Spring Data JPA Annotations

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);

Besides, we can use native SQL queries, if we set the nativeQuery argument to true:

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

For more information, please visit this article.

3.2. @Procedure

With Spring Data JPA we can easily call stored procedures from repositories.

First, we need to declare the repository on the entity class using standard JPA annotations:

@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 {}

After this, we can refer to it in the repository with the name we declared in the name argument:

@Procedure(name = "count_by_name") long getCountByName(@Param("name") String name);

3.3. @Lock

We can configure the lock mode when we execute a repository query method:

@Lock(LockModeType.NONE) @Query("SELECT COUNT(*) FROM Person p") long getPersonCount();

The available lock modes:

  • READ
  • WRITE
  • OPTIMISTIC
  • OPTIMISTIC_FORCE_INCREMENT
  • PESSIMISTIC_READ
  • PESSIMISTIC_WRITE
  • PESSIMISTIC_FORCE_INCREMENT
  • NONE

3.4. @Modifying

We can modify data with a repository method if we annotate it with @Modifying:

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

For more information, please visit this article.

3.5. @EnableJpaRepositories

To use JPA repositories, we have to indicate it to Spring. We can do this with @EnableJpaRepositories.

Note, that we have to use this annotation with @Configuration:

@Configuration @EnableJpaRepositories class PersistenceJPAConfig {}

Spring will look for repositories in the sub packages of this @Configuration class.

We can alter this behavior with the basePackages argument:

@Configuration @EnableJpaRepositories(basePackages = "com.baeldung.persistence.dao") class PersistenceJPAConfig {}

Also note, that Spring Boot does this automatically if it finds Spring Data JPA on the classpath.

4. Spring Data Mongo Annotations

Spring Data makes working with MongoDB much easier. In the next sections, we'll explore the most basic features of Spring Data MongoDB.

For more information, please visit our article about Spring Data MongoDB.

4.1. @Document

This annotation marks a class as being a domain object that we want to persist to the database:

@Document class User {}

It also allows us to choose the name of the collection we want to use:

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

Note, that this annotation is the Mongo equivalent of @Entity in JPA.

4.2. @Field

With @Field, we can configure the name of a field we want to use when MongoDB persists the document:

@Document class User { // ... @Field("email") String emailAddress; // ... }

Note, that this annotation is the Mongo equivalent of @Column in JPA.

4.3. @Query

With @Query, we can provide a finder query on a MongoDB repository method:

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

4.4. @EnableMongoRepositories

To use MongoDB repositories, we have to indicate it to Spring. We can do this with @EnableMongoRepositories.

Note, that we have to use this annotation with @Configuration:

@Configuration @EnableMongoRepositories class MongoConfig {}

Spring will look for repositories in the sub packages of this @Configuration class. We can alter this behavior with the basePackages argument:

@Configuration @EnableMongoRepositories(basePackages = "com.baeldung.repository") class MongoConfig {}

Also note, that Spring Boot does this automatically if it finds Spring Data MongoDB on the classpath.

5. Conclusion

В тази статия видяхме кои са най-важните пояснения, от които се нуждаем, за да се справим с данните като цяло, като използваме Spring. Освен това разгледахме най-често срещаните анотации на JPA и MongoDB.

Както обикновено, на GitHub има примери за общи и JPA анотации и тук за MongoDB анотации.

Напред » Анотации на пролетни зърна « Предишни анотации за планиране на пролетта