Spring Data Annotations

Anmerkungen zu den Frühlingsdaten

1. Einführung

Spring Data bietet eine Abstraktion über Datenspeichertechnologien. Daher kann unser Geschäftslogikcode viel unabhängiger von der zugrunde liegenden Persistenzimplementierung sein. Spring vereinfacht auch die Handhabung implementierungsabhängiger Details der Datenspeicherung.

In diesem Lernprogramm werden die häufigsten Anmerkungen zu den Projekten Spring Data, Spring Data JPA und Spring Data MongoDB angezeigt.

2. Gemeinsame Anmerkungen zu den Frühlingsdaten

2.1. @Transactional

Wenn wirconfigure the transactional behavior of a method wollen, können wir es tun mit:

@Transactional
void pay() {}

Wenn wir diese Annotation auf Klassenebene anwenden, funktioniert sie auf allen Methoden innerhalb der Klasse. Wir können die Auswirkungen jedoch überschreiben, indem wir sie auf eine bestimmte Methode anwenden.

Es gibt viele Konfigurationsoptionen, die inthis article angegeben werden können.

2.2. @NoRepositoryBean

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

Natürlich möchten wir nicht, dass Spring eine Bean dieser Repositories erstellt, da wir sie nirgendwo injizieren. @NoRepositoryBean macht genau das: Wenn wir eine untergeordnete Schnittstelle vonorg.springframework.data.repository.Repository markieren, erstellt Spring keine Bean daraus.

Wenn wir beispielsweise eineOptional<T> findById(ID id) -Smethod in allen unseren Repositorys verwenden möchten, können wir ein Basis-Repository erstellen:

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

Diese Anmerkung wirkt sich nicht auf die untergeordneten Schnittstellen aus. Daher erstellt Spring eine Bean für die folgende Repository-Schnittstelle:

@Repository
interface PersonRepository extends MyUtilityRepository {}

Beachten Sie, dass das obige Beispiel seit Spring Data Version 2 nicht erforderlich ist, in der diese Methode die älterenT findOne(ID id)ersetzt.

2.3. @Param

Wir können benannte Parameter mit@Param an unsere Abfragen übergeben:

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

Beachten Sie, dass wir uns auf den Parameter mit der:name -Ssyntax beziehen.

Weitere Beispiele finden Sie unterthis article.

2.4. @Id

@Id raucht ein Feld in einer Modellklasse als Primärschlüssel:

class Person {

    @Id
    Long id;

    // ...

}

Da es implementierungsunabhängig ist, ist eine Modellklasse mit mehreren Datenspeicher-Engines einfach zu verwenden.

2.5. @Transient

Mit dieser Annotation können wir ein Feld in einer Modellklasse als vorübergehend markieren. Daher kann die Datenspeicher-Engine den Wert dieses Felds nicht lesen oder schreiben:

class Person {

    // ...

    @Transient
    int age;

    // ...

}

Wie@Id ist auch@Transient  implementierungsunabhängig, was die Verwendung mit mehreren Datenspeicherimplementierungen bequem macht.

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

Mit diesen Anmerkungen können wir unsere Modellklassen prüfen: Spring füllt die mit Anmerkungen versehenen Felder automatisch mit dem Prinzipal, der das Objekt erstellt, zuletzt geändert und das Erstellungsdatum sowie die letzte Änderung:

public class Person {

    // ...

    @CreatedBy
    User creator;

    @LastModifiedBy
    User modifier;

    @CreatedDate
    Date createdAt;

    @LastModifiedDate
    Date modifiedAt;

    // ...

}

Beachten Sie, dass Spring Security ebenfalls verwendet werden muss, wenn Spring die Principals füllen soll.

Eine ausführlichere Beschreibung finden Sie unterthis article.

3. JPA-Anmerkungen zu Frühlingsdaten

3.1. @Query

Mit@Query können wir eine JPQL-Implementierung für eine Repository-Methode bereitstellen:

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

Wir können auch benannte Parameter verwenden:

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

Außerdem können wir native SQL-Abfragen verwenden, wenn wir dasnativeQuery -Sargument auftrue setzen:

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

Weitere Informationen finden Sie unterthis article.

3.2. @Procedure

Mit Spring Data JPA können wir gespeicherte Prozeduren einfach aus Repositorys aufrufen.

Zuerst müssen wir das Repository für die Entitätsklasse mit Standard-JPA-Annotationen deklarieren:

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

Danach können wir im Repository mit dem Namen darauf verweisen, den wir imname -Sargument deklariert haben:

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

3.3. @Lock

Wir können den Sperrmodus konfigurieren, wenn wir eine Repository-Abfragemethode ausführen:

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

Die verfügbaren Sperrmodi:

  • READ

  • SCHREIBEN

  • OPTIMISTISCH

  • OPTIMISTIC_FORCE_INCREMENT

  • PESSIMISTIC_READ

  • PESSIMISTIC_WRITE

  • PESSIMISTIC_FORCE_INCREMENT

  • NONE

3.4. @Modifying

Wir können Daten mit einer Repository-Methode ändern, wenn wir sie mit@Modifying kommentieren:

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

Weitere Informationen finden Sie unterthis article.

3.5. @EnableJpaRepositories

Um JPA-Repositorys zu verwenden, müssen wir Spring darauf hinweisen. Wir können dies mit@EnableJpaRepositories. tun

Beachten Sie, dass wir diese Annotation mit@Configuration verwenden müssen:

@Configuration
@EnableJpaRepositories
class PersistenceJPAConfig {}

Spring sucht in den Unterpaketen dieser@Configuration -Klasse nach Repositorys.

Wir können dieses Verhalten mit dem SargumentbasePackages ändern:

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

Beachten Sie auch, dass Spring Boot dies automatisch tut, wenn es Spring Data JPA im Klassenpfad findet.

4. Spring Data Mongo-Anmerkungen

Spring Data erleichtert die Arbeit mit MongoDB erheblich. In den nächsten Abschnitten werden die grundlegendsten Funktionen von Spring Data MongoDB erläutert.

Weitere Informationen finden Sie in unserenarticle about Spring Data MongoDB.

4.1. @Document

Diese Anmerkung kennzeichnet eine Klasse als ein Domänenobjekt, das in der Datenbank beibehalten werden soll:

@Document
class User {}

Außerdem können wir den Namen der Sammlung auswählen, die wir verwenden möchten:

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

Beachten Sie, dass diese Anmerkung das Mongo-Äquivalent von@Entity in JPA ist.

4.2. @Field

Mit@Field können wir den Namen eines Felds konfigurieren, das wir verwenden möchten, wenn MongoDB das Dokument beibehält:

@Document
class User {

    // ...

    @Field("email")
    String emailAddress;

    // ...

}

Beachten Sie, dass diese Anmerkung das Mongo-Äquivalent von@Column in JPA ist.

4.3. @Query

Mit@Query können wir eine Finder-Abfrage für eine MongoDB-Repository-Methode bereitstellen:

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

4.4. @EnableMongoRepositories

Um MongoDB-Repositorys verwenden zu können, müssen wir Spring darauf hinweisen. Wir können dies mit@EnableMongoRepositories. tun

Beachten Sie, dass wir diese Annotation mit@Configuration verwenden müssen:

@Configuration
@EnableMongoRepositories
class MongoConfig {}

Spring sucht in den Unterpaketen dieser@Configuration -Klasse nach Repositorys. Wir können dieses Verhalten mit dembasePackages -Sargument ändern:

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

Beachten Sie auch, dass Spring Boot dies automatisch durchführt, wenn Spring Data MongoDB im Klassenpfad gefunden wird.

5. Fazit

In diesem Artikel haben wir die wichtigsten Anmerkungen gesehen, die wir benötigen, um mit Spring mit Daten im Allgemeinen umzugehen. Darüber hinaus haben wir uns mit den häufigsten JPA- und MongoDB-Anmerkungen befasst.

Wie üblich sind Beispiele für allgemeine und JPA-Annotationen auf GitHubhere und für MongoDB-Annotationen aufhere verfügbar.