Was ist der Unterschied zwischen JPA und Hibernate? [geschlossen]


680

Ich verstehe, dass JPA 2 eine Spezifikation und Hibernate ein Tool für ORM ist. Ich verstehe auch, dass Hibernate mehr Funktionen als JPA 2 bietet. Aber was ist aus praktischer Sicht wirklich der Unterschied?

Ich habe Erfahrung mit iBatis und versuche jetzt, entweder Hibernate oder JPA2 zu lernen. Ich habe das Pro JPA2-Buch aufgenommen und es bezieht sich immer wieder auf "JPA-Anbieter". Zum Beispiel:

Wenn Sie der Meinung sind, dass eine Funktion standardisiert werden sollte, sollten Sie sich bei Ihrem JPA-Anbieter melden

Das verwirrt mich und ich habe ein paar Fragen:

  • Mit JPA2 allein kann ich Daten aus der Datenbank abrufen, indem ich einfach meine POJOs mit Anmerkungen versehen kann
  • Soll JPA2 mit einem "JPA-Anbieter" verwendet werden, z. B. TopLink oder Hibernate? Wenn ja, welchen Vorteil hat die Verwendung von JPA2 + Hibernate im Vergleich zu JPA2 allein oder im Vergleich zu Hibernate allein?
  • Können Sie ein gutes praktisches JPA2-Buch empfehlen? "Pro JPA2" scheint eher eine Bibel und eine Referenz zu JPA2 zu sein (es wird erst in der späteren Hälfte des Buches in Abfragen aufgenommen). Gibt es ein Buch, das einen Problem- / Lösungsansatz für JPA2 verfolgt?

2
Die Frage nach dem Unterschied zwischen JPA und Hibernate ist falsch. Battle Hibernate gegen JPA ist sinnlos. Es ist ratsam, eine Implementierung von JPA mit JPA-API zu verwenden, um die Implementierung unterschiedlicher ORM zu vermeiden.
BERGUIGA Mohamed Amine

18
@ Berguiga.M.Amine, Wenn wir bereits gewusst haben, dass diese obige Frage falsch ist. Wir müssen nicht mehr fragen. Ich interessiere mich auch für dieses Thema.
Do Nhu Vy

Ich habe eine Verwechslung mit JpaTemplate, das im Frühjahr "org.springframework.orm.jpa.JpaTemplate" verwendet wurde. Es hat seine eigenen Funktionen wie persist (), find (), merge () usw., wie funktionieren die Dinge dann ohne Ruhezustand?
Nitin Verma

@ Nitinverma: Das ist wirklich eine separate Frage. Wenn Sie noch eine Antwort benötigen, empfehlen wir Ihnen, Ihre eigene Frage separat zu stellen, um mehr Feedback zu erhalten.
Wouter

Antworten:


776

Wie Sie sagen, ist JPA nur eine Spezifikation, was bedeutet, dass es keine Implementierung gibt. Sie können Ihre Klassen mit JPA-Annotationen beliebig oft mit Anmerkungen versehen. Ohne eine Implementierung geschieht jedoch nichts. Stellen Sie sich JPA als die Richtlinien vor, die befolgt werden müssen, oder als Schnittstelle, während die JPA-Implementierung von Hibernate Code ist, der der in der JPA-Spezifikation definierten API entspricht und die Funktionalität unter der Haube bietet.

Wenn Sie Hibernate mit JPA verwenden, verwenden Sie tatsächlich die JPA-Implementierung von Hibernate. Dies hat den Vorteil, dass Sie die Implementierung von JPA durch Hibernate gegen eine andere Implementierung der JPA-Spezifikation austauschen können. Wenn Sie Straight Hibernate verwenden, sind Sie an die Implementierung gebunden, da andere ORMs möglicherweise andere Methoden / Konfigurationen und Anmerkungen verwenden. Daher können Sie nicht einfach zu einem anderen ORM wechseln.

Für eine detailliertere Beschreibung lesen Sie meinen Blogeintrag .


5
Wenn Sie also den Ruhezustand mit JPA verwenden, funktionieren die Annotationen {java.persistence} oder Sie müssen die Annotationen {org.hibernate} verwenden?
Amruta

62
Ich wollte nur hinzufügen, dass das Ersetzen eines ORM durch ein anderes eine sehr seltene Gelegenheit ist, sodass Sie diesen Vorteil wahrscheinlich nie aus der Verwendung von JPA ziehen würden. Was Sie mit JPA gewinnen, sind ein Protokoll, Standards, Namen und andere Konventionen, mit denen Sie mit anderen kommunizieren können.
Pubsy

3
@pubsy Ich stimme zu, aber im Prinzip ist das eines der Verkaufsargumente einer Spezifikation.
Kevin Bowersox

6
@Amruta Um Ihre Frage zu beantworten: Wenn Sie Hibernate mit JPA verwenden, funktionieren die Annotationen {java.persistence} und es ist nicht erforderlich, Annotationen {org.hibernate} zu verwenden.
Lerner

3
@JavaGeek das ist wahr, solange der eigene Code nur die in JPA erwähnte Schnittstelle verwendet. Wenn man Funktionen verwendet, die für den Ruhezustand spezifisch sind, müssen sie die org.hibernateAnmerkung verwenden. mehr dazu
Suryavanshi

632

JPA ist der Tanz, Hibernate ist der Tänzer.


189
JPA ist die Kunst, Hibernate ist der Künstler.
Glücklicher

10
Ich mag diesen Sinn für Humor :) JPA ist ein Regisseur, Hibernate ist ein Schauspieler.
user3278897

7
Aber Dancer (Hibernate) kann ohne Tanz (JPA) auftreten, nicht
wahr

3
Diese Antwort erklärt nichts, nur ein vages Sprichwort.
Amir Kost

11
Diese Metapher fügt kein Verständnis hinzu. Wenn Sie den Unterschied bereits kennen, werden Sie ihn amüsant finden. Wenn Sie den Unterschied nicht kennen, werden Sie ihn immer noch nicht kennen.
Nick Volynkin

158

Einige Dinge sind ohne eine historische Perspektive der Sprache und des Verständnisses der JCP zu schwer zu verstehen.

Oft gibt es Dritte, die Pakete entwickeln, die eine Funktion ausführen oder eine Lücke füllen, die nicht Teil des offiziellen JDK sind. Aus verschiedenen Gründen kann diese Funktion über das JCP (Java Community Process) Teil des Java JDK werden.

Hibernate (2003) bot eine Möglichkeit, SQL zu abstrahieren und Entwicklern zu ermöglichen, mehr über persistierende Objekte (ORM) nachzudenken. Sie benachrichtigen den Ruhezustand über Ihre Entitätsobjekte und es wird automatisch die Strategie generiert, diese beizubehalten. Hibernate stellte hierfür eine Implementierung und die API bereit, um die Implementierung entweder über die XML-Konfiguration oder über Anmerkungen zu steuern.

Das grundlegende Problem ist jetzt, dass Ihr Code eng mit einem bestimmten Anbieter (Hibernate) gekoppelt wird, für den viele Leute dachten, dass er allgemeiner sein sollte. Daher ist eine generische Persistenz-API erforderlich.

In der Zwischenzeit entwickelte das JCP mit vielen Beiträgen von Hibernate und anderen ORM-Tool-Anbietern JSR 220 (Java Specification Request), was zu JPA 1.0 (2006) und schließlich JSR 317 (JPA 2.0 (2009)) führte. Dies sind Spezifikationen einer generischen Java-Persistenz-API. Die API wird im JDK als eine Reihe von Schnittstellen bereitgestellt, sodass Ihre Klassen von der javax.persistence abhängen können und sich nicht um den bestimmten Anbieter kümmern müssen, der die Arbeit zum Speichern Ihrer Objekte ausführt. Dies ist nur die API und nicht die Implementierung. Der Ruhezustand wird nun zu einem der vielen Anbieter, die die JPA 2.0-Spezifikation implementieren. Sie können in Richtung JPA codieren und den für Ihre Anforderungen geeigneten ORM-Anbieter auswählen.

In einigen Fällen bietet Ihnen Hibernate möglicherweise Funktionen, die in JPA nicht kodifiziert sind. In diesem Fall können Sie eine Hibernate-spezifische Annotation direkt in Ihre Klasse einfügen, da JPA nicht die Schnittstelle dafür bereitstellt.

Quelle: http://www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_hibernate/


2
Gute Geschichte Teil. während andere Antworten nur wiederholen, was in der Frage steht.
Robert

1
Vielen Dank für diese aufschlussreichen Präzisionen. Sie sagten, JPA wurde durchgeführt, weil Anwendungen eng mit Hibernate verbunden waren und eine Abstraktion erforderlich war, ok. Aber ist es nicht ein unendliches Problem? Ist die Anwendung jetzt nicht eng mit JPA verbunden? Was ist der wahre Vorteil hier? Ich sehe Hibernate bereits als Abstraktionsschicht ...
Aphax

4
@Aphax Sicher, und wenn Sie Java-Dateien codieren, sind Sie auch eng mit Java verbunden. Was ist, wenn ich morgen zu Python wechseln möchte?
Smutje

100

JPA ist die Schnittstelle, während Hibernate die Implementierung ist.

Traditionell gab es mehrere Java ORM-Lösungen:

Jede Implementierung definiert ihre eigene Mapping-Definition oder Client-API. Die JPA-Expertengruppe hat das Beste aus all diesen Tools zusammengestellt und so den Java Persistence API-Standard erstellt.

Eine Standard-Persistenz-API ist aus Client-Sicht sehr praktisch und macht es relativ einfach, eine Implementierung durch die andere zu wechseln (obwohl dies in der Praxis nicht so einfach ist, da Sie bei großen Projekten ohnehin bestimmte nicht standardmäßige Funktionen verwenden müssen). .

Die Standard-JPA hat die Java-ORM-Konkurrenz auf ein neues Niveau gebracht, und dies kann nur zu besseren Implementierungen führen.

Wie in meinem Buch "Hochleistungs-Java-Persistenz" erläutert , bietet Hibernate Funktionen, die von JPA noch nicht unterstützt werden :

Mit diesen zusätzlichen Funktionen kann Hibernate viele Persistenzanforderungen erfüllen, die von großen Unternehmensanwendungen gefordert werden.


Dies ist gut, ich wusste nicht über andere ORM-Tools früher
Avdhut

Tolle Antwort und ich genieße das Buch sehr! Danke, dass du es veröffentlicht hast!
JonasJSchreiber

Vielen Dank, dass Sie mein High-Performance Java Persistence- Buch genossen haben .
Vlad Mihalcea

Diese ~ JPA ist die Schnittstelle, während Hibernate die Implementierung ist
Eddie B

57

Aus dem Wiki .

Motivation zum Erstellen der Java Persistence API

Viele Java-Entwickler in Unternehmen verwenden leichtgewichtige persistente Objekte, die von Open-Source-Frameworks oder Datenzugriffsobjekten bereitgestellt werden, anstelle von Entity-Beans: Entity-Beans und Enterprise-Beans galten als zu schwergewichtig und kompliziert, und man konnte sie nur in Java EE-Anwendungsservern verwenden. Viele der Funktionen der Persistenz-Frameworks von Drittanbietern wurden in die Java-Persistenz-API integriert, und ab 2006 wurden Projekte wie Hibernate (Version 3.2) und Open-Source-Version TopLink Essentials zu Implementierungen der Java-Persistenz-API.

Wie auf der JCP-Seite angegeben, ist der Eclipse-Link die Referenzimplementierung für JPA. Schauen Sie sich diese Antwort an, um mehr darüber zu erfahren.

JPA selbst verfügt über Funktionen, die ein Standard-ORM-Framework ausgleichen. Da JPA Teil der Java EE-Spezifikation ist, können Sie JPA allein in einem Projekt verwenden und es sollte mit allen Java EE-kompatiblen Servern funktionieren . Ja, diese Server verfügen über die Implementierungen für die JPA-Spezifikation.

Der Ruhezustand ist das beliebteste ORM- Framework, sobald der JPA eingeführt wurde. Der Ruhezustand entspricht den JPA- Spezifikationen. Abgesehen von den grundlegenden Spezifikationen, denen der Ruhezustand folgen sollte, werden viele zusätzliche Dinge bereitgestellt.


3
Das heißt, Sie können JPA allein in einem Projekt verwenden. Meinen Sie, ohne Hibernate, TopLink oder eine andere JPA-Implementierung zu verwenden?
abbas

2
@abbas ja. Die Java EE-Spezifikationen verwenden nur JPA. Wenn Sie den Ruhezustand hinzufügen, erhalten Sie einige zusätzliche Funktionen.
ManuPK

1
Ich habe gehört, JPA ist nur eine Schnittstelle / Spezifikation. Wenn wir JPA allein in einem Projekt verwenden, woher kommt dann die Implementierung?
Abbas

@abbas danke für den Kommentar. Ich habe der Antwort weitere Details hinzugefügt. Hoffe das hilft.
ManuPK

1
@Forhad Es muss immer eine Implementierung geben, egal ob sie in einer Serverarchitektur vergraben ist oder nicht. Es gibt keine Möglichkeit, einfach eine JPA-Bibliothek herunterzuladen und sie für Sie persistieren zu lassen.
Kevin Bowersox

15

JPA ist nur eine Spezifikation, die konkret implementiert werden muss. Die Standard-Implementierungs-Oracle- Bereitstellung ist jetzt "Eclipselink". (Toplink wird von Oracle an die Eclipse Foundation gespendet, um mit Eclipselink zu fusionieren.)

(Referenz: http://www.oracle.com/technetwork/middleware/toplink/index-085257.html http://www.eclipse.org/org/press-release/20080317_Eclipselink.php )

Mit Eclipselink kann man sicher sein, dass der Code bei Bedarf auf jede Implementierung portierbar ist. Hibernate ist auch eine vollständige JPA-Implementierung + MEHR (Art von JPA Plus). Hibernate ist ein Super-Set von JPA mit einigen zusätzlichen Hibernate-spezifischen Funktionen. In Hibernate entwickelte App ist daher möglicherweise nicht kompatibel, wenn auf eine andere Implementierung umgestellt wird. Der Ruhezustand ist immer noch die Wahl der Mehrheit der Entwickler als JPA-Implementierung und weit verbreitet.

Eine weitere JPA-Implementierung ist OpenJPA (openjpa.apache.org), eine Erweiterung der Kodo-Implementierung.


15

JPA: ist wie eine Schnittstelle und hat keine konkrete Implementierung, um Funktionen zu verwenden, die in JPA vorhanden sind.

Ruhezustand: ist nur ein JPA-Anbieter , der die Funktionen in JPA implementiert hat und einige zusätzliche Funktionen haben kann, die in JPA möglicherweise nicht vorhanden sind.

TIPP: Sie können verwenden

     *combo 1* : JPA + JPA Provider(Hibernate) 
     *combo 2* : only Hiberante which does not need any interface 

Combo 1 : wird verwendet, wenn Sie das Gefühl haben, dass Ihr Ruhezustand keine bessere Leistung bietet und Sie den JPA-Anbieter ändern möchten, wenn Sie Ihren JPA nicht erneut schreiben müssen. Sie können einen anderen JPA-Anbieter schreiben ... und so oft wie möglich ändern.

Combo 2 : wird sehr wenig verwendet, wenn Sie Ihren JPA-Anbieter nicht um jeden Preis wechseln.

Besuchen Sie http://blog-tothought.rhcloud.com//post/2 , wo Ihre völlige Verwirrung deutlich wird.


11

JPA ist die Schnittstelle, Hibernate ist eine Implementierung dieser Schnittstelle.


2
Darüber hinaus fügt Hibernate einige weitere Funktionen / Methoden hinzu.
rai.skumar


5

JPA ist nur eine Spezifikation. Auf dem Markt gibt es viele Anbieter, die JPA implementieren. Verschiedene Arten von Anbietern implementieren JPA auf unterschiedliche Weise. Verschiedene Anbietertypen bieten unterschiedliche Funktionen. Wählen Sie daher den richtigen Anbieter basierend auf Ihren Anforderungen.

Wenn Sie Hibernate oder einen anderen Anbieter anstelle von JPA verwenden, können Sie nicht einfach in den Ruhezustand zu EclipseLink oder OpenJPA in Hibernate wechseln. Wenn Sie jedoch JPA verwenden, müssen Sie lediglich die XML-Datei für die Persistenz ändern. Eine Migration ist daher in problemlos möglich JPA.


4

JPA ist eine API, die von Hibernate implementiert wird. Hibernate ist älter als JPA. Vor JPA schreiben Sie nativen Ruhezustandscode für Ihre ORM. JPA ist nur die Schnittstelle. Jetzt schreiben Sie JPA-Code und müssen eine Implementierung finden. Der Ruhezustand ist zufällig eine Implementierung.

Sie haben also folgende Möglichkeiten: Ruhezustand, Toplink usw.

Der Vorteil von JPA besteht darin, dass Sie Ihre Implementierung bei Bedarf austauschen können. Der Nachteil ist, dass die native API für den Ruhezustand / toplink / etc ... möglicherweise Funktionen bietet, die von der JPA-Spezifikation nicht unterstützt werden.


4

Während JPA die Spezifikation ist, ist Hibernate der Implementierungsanbieter, der die in der Spezifikation festgelegten Regeln befolgt.


3

Java - seine Unabhängigkeit ist nicht nur vom Betriebssystem, sondern auch vom Anbieter.

Daher Sie sollten Ihre Anwendung auf verschiedenen Anwendungsserver bereitstellen können. JPA ist auf jedem Java EE-kompatiblen Anwendungsserver implementiert und ermöglicht den Austausch von Anwendungsservern. Dann ändert sich jedoch auch die Implementierung. Eine Hibernate-Anwendung kann möglicherweise einfacher auf einem anderen Anwendungsserver bereitgestellt werden.


3

JPA ist eine Spezifikation, die Sie in Ihrer Datenschicht implementieren, um Datenbankoperationen, ODER-Zuordnungen und andere erforderliche Aufgaben auszuführen.

Da es sich nur um eine Spezifikation handelt , benötigen Sie ein Tool, um sie implementieren zu können. Dieses Tool kann entweder Hibernate, TopLink, iBatis, Spring-Data usw. sein.

Sie benötigen nicht unbedingt JPA, wenn Sie den Ruhezustand in Ihrer Datenschicht verwenden. Wenn Sie jedoch die JPA-Spezifikation für den Ruhezustand verwenden, wird der Wechsel zu anderen ORM-Tools wie iBatis und TopLink in Zukunft einfacher, da die Spezifikation auch für andere gilt.

* ( Wenn Sie sich erinnern, import javax.persistence.*;wenn Sie Anmerkungen für die ODER-Zuordnung (wie @Id, @Column, @GeneratedValue usw.) im Ruhezustand verwenden, können Sie dort JPA unter Ruhezustand verwenden. Sie können die @Query- und andere Funktionen von JPA als verwenden gut )


2

JPA ist eine Java-API-Spezifikation, die die Verwaltung relationaler Daten in Anwendungen mit Java Platform beschreibt. Dabei ist als Ruhezustand eine ORM-Bibliothek (Object Relational Mapping), die der JPA-Spezifikation folgt.

Sie können sich JPA als eine Reihe von Regeln vorstellen, die von Hibernate implementiert werden.


2

JPA ist JSR, dh Java-Spezifikationsanforderung zum Implementieren der objektrelationalen Zuordnung, für deren Implementierung kein spezifischer Code vorhanden ist. Es definiert bestimmte Regeln für den Zugriff auf, das Speichern und Verwalten der Daten zwischen Java-Objekten und der relationalen Datenbank. Mit seiner Einführung wurde EJB ersetzt, da es von der Java-Entwicklergemeinde als schwergewichtig kritisiert wurde. Der Ruhezustand ist eine der Möglichkeiten, wie JPA mithilfe der Richtlinien implementiert werden kann. Der Ruhezustand ist ein leistungsstarker Objekt- / relationaler Persistenz- und Abfragedienst, der unter der Open-Source-Lizenz GNU Lesser General Public License (LGPL) lizenziert ist. Der Vorteil davon ist, dass Sie kann die Implementierung von JPA durch Hibernate gegen eine andere Implementierung der JPA-Spezifikation austauschen.


1

JPA ist nur eine Spezifikation, die konkret implementiert werden muss. Die von Oracle bereitgestellte Standardimplementierung ist jetzt "Eclipselink". Toplink wird von Oracle an die Eclipse Foundation gespendet, um mit eclipselink zu fusionieren.

Mit Eclipselink kann man sicher sein, dass der Code bei Bedarf auf jede Implementierung portierbar ist. Hibernate ist auch eine vollständige JPA-Implementierung + MEHR. Hibernate ist ein Super-Set von JPA mit einigen zusätzlichen Hibernate-spezifischen Funktionen. In Hibernate entwickelte Anwendungen sind daher möglicherweise nicht kompatibel, wenn sie auf eine andere Implementierung umgestellt werden. Der Ruhezustand ist immer noch die Wahl der Mehrheit der Entwickler als JPA-Implementierung und weit verbreitet.

Eine weitere JPA-Implementierung ist OpenJPA, eine Erweiterung der Kodo-Implementierung.

JPA gegen Ruhezustand


1

Ich versuche es mit sehr einfachen Worten zu erklären.

Angenommen, Sie benötigen ein Auto, da wir alle wissen, dass es mehrere Hersteller der A-Klasse wie MERCEDES, BMW, AUDI usw. gibt.

Jetzt in der obigen Aussage CAR (ist eine Spezifikation), da jedes Auto gemeinsame Merkmale wie etwas mit 4 Rädern hat und auf der Straße gefahren werden kann, ist Auto ... also ist es wie JPA. Und MERCEDES, BMW, AUDI usw. verwenden nur gemeinsame Fahrzeugfunktionen und fügen Funktionen entsprechend ihrer Kundenbasis hinzu, damit sie die Fahrzeugspezifikationen wie Ruhezustand, iBATIS usw. implementieren.

Durch diese gemeinsamen Funktionen geht jpa und der Ruhezustand ist nur eine Implementierung entsprechend ihrem jboss-Bedarf.

1 weitere Sache

JPA enthält einige grundlegende Eigenschaften. Wenn Sie also in Zukunft den Ruhezustand auf eine andere Implementierung ändern möchten, können Sie problemlos ohne große Kopfschmerzen wechseln. Für diese grundlegenden Eigenschaften sind JPA-Anmerkungen enthalten, die für jede Implementierungstechnologie, JPQL-Abfragen, geeignet sind.

Daher implementieren wir hauptsächlich den Ruhezustand mit JPA-Technologie, nur für den Fall, dass wir unsere Implementierung entsprechend den Kundenanforderungen ändern möchten. Außerdem schreiben Sie weniger Code, da einige allgemeine Funktionen in JPA enthalten sind. Wenn jemand immer noch nicht klar ist, können Sie den Stapelüberlauf als neu kommentieren.

Vielen Dank


Vielen Dank für den Rat
Rajiv Baghel

0

JPA ist nur eine Spezifikation, während Hibernate einer der JPA-Anbieter ist, dh Hibernate implementiert verschiedene im JPA-Vertrag erwähnte Dinge.


0

Die JPA- oder Java-Persistenz-API ist eine Standardspezifikation für ORM-Implementierungen, während Hibernate die eigentliche ORM-Implementierung oder das eigentliche ORM-Framework ist.


-1

JPA ist die Java Persistence API. Womit nur die Spezifikationen für APIs angegeben werden. Bedeutet, dass die Regeln und Richtlinien zum Erstellen der APIs. Wenn ein anderer Kontext angegeben ist, handelt es sich um eine Reihe von Standards, die den Wrapper zum Erstellen dieser APIs bereitstellen und für den Zugriff auf Entitätsobjekte aus der Datenbank verwendet werden können. JPA wird von oracle bereitgestellt. Wenn wir auf die Datenbank zugreifen wollen, müssen wir diese unbedingt implementieren. Mittel JPA gibt nur Richtlinien für die Implementierung von APIs an. Hibernate ist ein JPA-Anbieter / Anbieter, der für die Implementierung dieser APIs verantwortlich ist. Wie Hibernate TopLink und Open JPA sind einige Beispiele für JPA-API-Anbieter. Daher verwenden wir JPA-spezifizierte Standard-APIs im Ruhezustand.


-2

Im übertragenen Sinne ist JPA nur eine Schnittstelle, Hibernate / TopLink - Klasse (dh Schnittstellenimplementierung).

Sie müssen über eine Schnittstellenimplementierung verfügen, um die Schnittstelle verwenden zu können. Sie können die Klasse jedoch über die Schnittstelle verwenden, dh den Ruhezustand über die JPA-API verwenden, oder Sie können die Implementierung direkt verwenden, dh den Ruhezustand direkt verwenden, nicht über die reine JPA-API.

Ein gutes Buch über JPA ist "High-Performance Java Persistence" von Vlad Mihalcea.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.