Anotasi Data Musim Semi

Artikel ini adalah sebahagian daripada siri: • Anotasi Inti Musim Semi

• Anotasi Web Spring

• Anotasi Boot Musim Semi

• Anotasi Penjadualan Musim Bunga

• Anotasi Data Musim Bunga (artikel semasa) • Anotasi Kacang Musim Bunga

1. Pengenalan

Spring Data memberikan penekanan terhadap teknologi penyimpanan data. Oleh itu, kod logik perniagaan kami jauh lebih bebas daripada pelaksanaan ketekunan yang mendasari. Juga, Spring mempermudah pengendalian perincian penyimpanan data yang bergantung pada pelaksanaan.

Dalam tutorial ini, kita akan melihat anotasi yang paling biasa untuk projek Spring Data, Spring Data JPA, dan Spring Data MongoDB.

2. Anotasi Data Musim Semi Biasa

2.1. @Transactional

Apabila kita ingin mengkonfigurasi tingkah laku transaksional kaedah , kita dapat melakukannya dengan:

@Transactional void pay() {}

Sekiranya kita menerapkan anotasi ini di peringkat kelas, maka ia berfungsi pada semua kaedah di dalam kelas. Namun, kita boleh mengatasi kesannya dengan menerapkannya pada kaedah tertentu.

Ia mempunyai banyak pilihan konfigurasi, yang terdapat dalam artikel ini.

2.2. @NoRepositoryBean

Kadang-kadang kita mahu membuat antara muka repositori dengan satu-satunya tujuan menyediakan kaedah biasa untuk repositori anak .

Sudah tentu, kami tidak mahu Spring membuat biji repositori ini kerana kami tidak akan menyuntiknya di mana sahaja. @NoRepositoryBean melakukan ini dengan tepat: apabila kita menandakan antara muka kanak-kanak org.springframework.data.repository.Repository , Spring tidak akan menghasilkan kacang daripadanya.

Sebagai contoh, jika kita mahukan kaedah FindById (id ID) Pilihan di semua repositori kita, kita boleh membuat repositori asas:

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

Anotasi ini tidak mempengaruhi antara muka kanak-kanak; oleh itu Spring akan membuat kacang untuk antara muka repositori berikut:

@Repository interface PersonRepository extends MyUtilityRepository {}

Perhatikan bahawa contoh di atas tidak diperlukan kerana Spring Data versi 2 yang merangkumi kaedah ini menggantikan T findOne (ID id) yang lebih lama .

2.3. @Param

Kami boleh meneruskan parameter bernama ke pertanyaan kami menggunakan @Param :

@Query("FROM Person p WHERE p.name = :name") Person findByName(@Param("name") String name);

Perhatikan, bahawa kita merujuk pada parameter dengan sintaks : name .

Untuk contoh lebih lanjut, sila lawati artikel ini.

2.4. @ID

@Id menandakan bidang dalam kelas model sebagai kunci utama:

class Person { @Id Long id; // ... }

Oleh kerana tidak bergantung kepada pelaksanaan, ini menjadikan kelas model mudah digunakan dengan pelbagai mesin penyimpanan data.

2.5. @Langsung

Kita boleh menggunakan anotasi ini untuk menandakan medan dalam kelas model sebagai sementara. Oleh itu mesin penyimpanan data tidak akan membaca atau menulis nilai bidang ini:

class Person { // ... @Transient int age; // ... }

Seperti @Id , @Transient juga bebas pelaksanaan, yang menjadikannya mudah digunakan dengan banyak implementasi penyimpanan data.

2.6. @CreatedBy , @LastModifiedBy , @CreatedDate , @LastModifiedDate

Dengan anotasi ini, kami dapat mengaudit kelas model kami: Spring secara automatik mengisi medan anotasi dengan prinsipal yang membuat objek, terakhir mengubahnya, dan tarikh penciptaan, dan pengubahsuaian terakhir:

public class Person { // ... @CreatedBy User creator; @LastModifiedBy User modifier; @CreatedDate Date createdAt; @LastModifiedDate Date modifiedAt; // ... }

Perhatikan, jika kita mahu Spring mengisi prinsipal, kita juga perlu menggunakan Spring Security.

Untuk keterangan yang lebih terperinci, sila lawati artikel ini.

3. Anotasi JPA Spring Data

3.1. @ Pertanyaan

Dengan @Query , kami dapat menyediakan pelaksanaan JPQL untuk kaedah repositori:

@Query("SELECT COUNT(*) FROM Person p") long getPersonCount();

Kita juga boleh menggunakan parameter bernama:

@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

Dalam artikel ini, kami melihat anotasi paling penting yang kami perlukan untuk menangani data secara umum, menggunakan Spring. Sebagai tambahan, kami melihat penjelasan JPA dan MongoDB yang paling biasa.

Seperti biasa, contoh boleh didapati di GitHub di sini untuk anotasi umum dan JPA, dan di sini untuk anotasi MongoDB.

Seterusnya » Anotasi Kacang Musim Bunga « Anotasi Penjadualan Musim Semi Sebelumnya