JDBC vs Hibernate vs JPA vs JDO
Quin API és millor per accedir en una base de dades relacional amb Java? SQL vs Hibernate vs JPA vs JDO ?
Primer de tot cal aclarir conceptes:
- JDO i JPA són tots dos especificacions, no són implementacions
- Tant JDO com JPA permeten fer consultes a la base de dades relacional i mapar els resultats en objectes java. De la mateixa manera també permet fer l’operació inversa i gravar informació a la base de dades a partir d’objectes Java.
- En canvi SQL permet escriure codi sql i executar-lo en Java. El codi sql només permet gravar tipus de dades que entengui la base de dades, així que no es poden gravar objectes Java.
- La idea de les especificacions, és que puguis tenir diverses implementacions de la mateixa especificació i que puguis triar la que millor et vagi a cada moment.
- Hibernate és una implementació de JPA. Tot i que té algunes coses que van més enllà de l’especificació de JPA.
Pros i Contres
Pros d’utilitzar SQL:
- java.sql.* és el api més senzill per accedir a una base de dades relacional
- Permet escriure tot el SQL possible per la base de dades.
Contres d’utilitzar SQL:
- Si es vol treballar amb orientació objectes Java i utilitzar Sql , no hi ha més remei que copiar a mà un a un tots els valors del resultat d’una consulta sql al objecte java.
- Quan es van consultes amb preparedstatement i s’utilitzen paràmetres, cal passar els paràmetres per ordre que apareixen els ‘?’ en el sql, no hi ha manera d’utilitzar noms de paràmetres dins el sql.
Pros d’utilitzar JDO:
- JDO permet treballar amb bases de dades no relacionals: ,db4o, hbase, ldap, bigtable, couchdb (connectors de cassandra) etc…
- Tant pots treballar amb datasources sql com amb no-sql.
- Com que no utilitza objectes proxyno proxy no hi ha problemes després alhora de comparar si dos objectes són iguals o no via hashcode() o equals().
- Objectes Java són bàsicament POJO
- Permet més tipus de camps de base de dades
Contres d’utilitzar JDO:
- El desenvolupament de JDO es va aturar
- Les implementacions de JDO utilitzen bytecode enhancements
Pros d’utilitzar JPA (hibernate):
- És més utilitzat
- Permet fer consultes amb un sql millorat per a treballar amb objectes: HQL.
- Permet fer consultes amb un SQL reduït.
- Permet fer consultes també via mètodes java, sense utilitzar HQL ni SQL (Criteria).
Contres d’utilitzar JPA (hibernate):
- Si es fan consultes amb un SQL reduït, hi ha moltes sorpreses desagradables i paraules prohibides.
- Quan es comparen dos objectes, no es pot utilitzar equals(), cal comparar el valor dels mètodes Java que tenen la clau primària (pk).
- HQL no permet fer unions.
- Criteria és molt complicada quan es volen fer joins.
Al Java li passa com a la majoria de llenguatges amb èxit: el perden les sigles. I un dels llocs que més es nota el problema és amb l’accés a la base de dades.
Més informació: Hibernate vs JPA vs JDO – pros and cons of each? – Stack Overflow.