JPA und Hibernate

Hallo Leute,

bin zum erstmal hier und hoffe hier eine gute Informationsequelle zu Fragen gefunden zu haben :smiley:
Ich selbst komme aus dem PHP Bereich und fange jetzt gerad erst an mich in Java einzuarbeiten.
Ich bin gerad dabei mein erstes eigenes Projekt auf die Beine zu stellen.

Ich habe mir eine paar Tutorials angeschen bzgl. JPA und Hibernate.
Somit komme ich auch gleich zu einer ersten Frage.
Benötigt JPA denn unbedingt Hibernate??? Ich denke mir wenn JPA over Hibernate benutzt wird ist dieses ein unbenötigter Headover seitens Hibernate.

In meinem Projekt setzte ich Maven ein.
In der POM reicht da für JPA

[XML]

org.hibernate.javax.persistence
hibernate-jpa-2.0-api
1.0.1.Final

[/XML]

aus?

Hibernate ist eine Implementierung/Umsetzung von JPA. Du kannst JPA auch mittels EclipseLink, Apache OpenJPA usw. nutzen, bist also nicht auf Hibernate angewiesen. Allerdings ist es nicht möglich JPA ohne weitere Implementierung zu nutzen, für ein Framework muss man sich also entscheiden.

Dein Auschnitt aus der pom.xml geht aber schon auf die Hibernate-Implementierung von JPA. Für JPA direkt brauchst du keine Abhängigkeiten definieren, seit JDK 1.5 ist dies im JDK enthalten.

Alle Angaben nach besten Gewissen, bei Fehlern möcchte man mich bitte korrigieren :wink:

Dann komme ich mal deinem Wunsch nach.

JPA ist im Enterprise Java definiert und dort seit dem Api-Level 5. Also Jee5 und nicht im JDK. Du wirst in der Java-API kein javax.persistence.Entity finden.

Ein Applicationserver nach Spec bringt immer eine JPA Implementierung mit.

D.h. wenn man ein Enterprise Projekt macht, dann benötigt man in der Pom nur eine Dependency zu javax.persistence, bzw. zur Jee-5,6,7 Api, da dies dort enthalten ist.

Beim Deployment stellt der AS dann den Rest bereit, außer man möchte abweichen und stellt seine eigene Implementierung zur Verfügung.

Möchte man in einem J2SE-Projekt JPA benutzen, dann benötigt man einmal javax.persistence zum Kompilieren und spätestens zur Runtime eine JPA Implementierung.

Meine POM sieht momentan wie folgt aus:

[XML]

4.0.0
com.abado.myhrm
MyHRM
0.0.1-SNAPSHOT
war

4.1.2.RELEASE junit junit 4.8.2 test
<dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.16</version>
   <scope>test</scope>	   
</dependency>
        
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.5</version>
</dependency>
        
<!-- Hibernate dependencies -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.1.0.Final</version>
</dependency>
             
<dependency>
    <groupId>javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.12.1.GA</version>
</dependency>
 
<!-- MySQL Java Connector dependency -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.17</version>
</dependency>
 
<!-- c3p0 dependency -->
<dependency>
    <groupId>c3p0</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.1.2</version>
</dependency> 

<!-- JPA 2.0 -->    
<dependency>
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.0-api</artifactId>
    <version>1.0.1.Final</version>
</dependency>

 <!-- Spring 3 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>
 
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
</dependency>
     
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${spring.version}</version>
</dependency>
     
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>${spring.version}</version>
</dependency>
 
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${spring.version}</version>
</dependency>

<!-- JSF dependencies -->
<dependency>
  <groupId>com.sun.faces</groupId>
  <artifactId>jsf-api</artifactId>
  <version>2.1.6</version>
</dependency>
 
<dependency>
  <groupId>com.sun.faces</groupId>
  <artifactId>jsf-impl</artifactId>
  <version>2.1.6</version>
</dependency>
     
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

<!-- Primefaces dependencies -->
<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>5.1</version>
</dependency>
[/XML]

Wenn ich dich richtig verstehe brauche ich gar nicht
[XML]


org.hibernate
hibernate-core
4.1.0.Final

<dependency>
    <groupId>javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.12.1.GA</version>
</dependency>

[/XML]

angeben, oder?

Was möchtest du machen?

Auf was soll das nachher laufen?
JBoss/Wildfly, Glassfish oder nur einem Tomcat?

[XML]
4.0.0
org.example
jee7.helloworld
0.0.1-SNAPSHOT
war


javax
javaee-api
7.0
provided



jee7.helloworld


<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
false

[/XML]

Ist eine POM die ich für Jee7 Projekte verwende.
Das War-File das dabei rauskommt ist 6 kb groß und läuft sowohl auf einem JBoss und einem Glassfish.

Spring ist eine Glaubensfrage. Entweder Spring auf Tomcat/Jetty und ich hole mir alle Frameworks die ich benötige über Spring, oder ich nutze gleich einen AS der alles bereits mitbringt. Deshalb auch die Fragen von weiter oben.

Ich habe lieber JEE. Spring war eine lange Zeit mit den Features sehr weit voraus und bot Sachen die JEE noch nicht geboten hat. Mitlerweile sind diese Dinge, die sich als gut erwiesen haben in den aktuellen Versionen von JEE bereits enthalten.

Wie gesagt ist es halt eine Glaubensfrage.

java - What’s the difference between JPA and Hibernate? - Stack Overflow

Es sei angemerkt, dass man JPA auch in ganz stinknormalen standalone Java-SE-Applikationen verwenden kann. Wie schon oben gesagt braucht man natürlich eine Implementierung wie Hibernate oder Eclipselink dafür, und ohne weitere Unterstützung durch Frameworks oder Servlet-Container muss man sich am Anfang den EntityManager selbst holen, aber dann läuft alles wie gewohnt. Komisch, dass von dieser Möglichkeit anscheinend relativ wenig Gebrauch gemacht wird.

Hier ein Beispiel (sollte sich leicht von EclipseLink auf Hibernate umbiegen lassen) JPA 2.0 with EclipseLink - Tutorial

Erstmal herzlichen Dank an alle.

[QUOTE=Unregistered]Was möchtest du machen?

Auf was soll das nachher laufen?
JBoss/Wildfly, Glassfish oder nur einem Tomcat?
[/QUOTE]

Eigentlich für eine Tomcat… aber nur interesseshalber wo wäre denn der Unterschied?

Kurze Antwort:

Ein Tomcat/Jetty/Undertow sind nur Webcontainer. Dort kannst Du Servlets einbinden muss Dich aber um viele Dinge (wie DB-Anbindung) selbst kümmern. Hier kommt häufig Spring zum Einsatz.

Ein JBoss/Wildfly/Glassfish ist ein spezifizierter Application Server, der alle Container für Java Enterprise mitbringt. Hier musst Du nur noch einige Dinge konfigurieren und bekommst damit ein mächtiges Werkzeug. Allerdings sind dort meist Komponenten nicht leicht austauschbar. Hier wird auch häufig von Spring abgeraten, weil der AS eigentlich alles mitbringt.