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.