Pregunta

Estoy familiarizado con ORM como un concepto, e incluso he usado nHibernate hace varios años para que un .Proyecto de RED;sin embargo, no he seguido el tema de ORM en Java y no he tenido la oportunidad de utilizar cualquiera de estas herramientas.

Pero, ahora que yo tenga la oportunidad de comenzar a utilizar algunas herramientas ORM para una de nuestras aplicaciones, en un intento de alejarse de una serie de legado de servicios web.

Estoy teniendo un tiempo difícil decir la diferencia entre la especificación JPA, lo que se consigue con la Hibernación de la biblioteca en sí, y lo JDO tiene para ofrecer.

Por tanto, entiendo que esta pregunta es un poco abierto, pero tenía la esperanza de obtener algunas opiniones sobre:

  • ¿Cuáles son los pros y los contras de cada uno?
  • Qué sugeriría usted para un nuevo proyecto?
  • Existen determinadas condiciones, cuando tendría sentido utilizar un framework vs el otro?
¿Fue útil?

Solución

Algunas notas:

  • JDO y JPA son ambas especificaciones, no implementaciones.
  • La idea es que puede cambiar las implementaciones de JPA, si se restringe el código para utilizar estándar JPA solamente. (Lo mismo ocurre con JDO.)
  • Hibernate puede ser utilizado como una tal ejecución de la APP.
  • No obstante, Hibernate proporciona una API nativa, con características que van más allá que la de la APP.

OMI, recomendaría Hibernate.


Ha habido algunos comentarios / preguntas sobre lo que debe hacer si necesidad para utilizar las funciones de hibernación-específicos. Hay muchas maneras de ver esto, pero mi consejo sería:

  • Si no está preocupado por la posibilidad de proveedor tie-in, a continuación, hacer su elección entre Hibernate y otras implementaciones de JPA y JDO incluyendo las extensiones específicas de diversos proveedores en su toma de decisiones .

  • Si está preocupado por la posibilidad de proveedor tie-in, y no se puede utilizar JPA sin recurrir al proveedor extensiones específicas, no utilice la APP. (Lo mismo ocurre con JDO).

En realidad, es probable que necesite para el comercio-off cuánto que están preocupados por el proveedor tie-in frente a cuánto que necesitan esas extensiones específicas del vendedor.

Y hay otros factores también, como lo bien que lo / a su personal conoce las respectivas tecnologías, la cantidad de los productos tendrán un costo de licencias, y cuya historia usted cree acerca de lo que va a ocurrir en el futuro para JDO y JPA.

Otros consejos

Asegúrese de evaluar la aplicación de DataNucleus JDO. Empezamos con Hibernate, ya que parecía ser tan popular pero muy pronto se dio cuenta de que no es una solución persistencia transparente 100%. Hay demasiadas advertencias y la documentación está lleno de 'si tiene esta situación, entonces debe escribir el código como el' que se llevó la diversión de modelar libremente y codificación como queramos. JDO tiene no me causaron a ajustar mi código o mi modelo para conseguir que 'el trabajo correctamente'. Sólo puedo diseñar y POJOs código simple como si iba a usarlos 'en memoria' solamente, sin embargo, pueden persistir de forma transparente.

La otra ventaja de JDO / DataNucleus más de hibernación es que no tiene todo el tiempo de ejecución de reflexión por encima y es más eficiente de la memoria, ya que utiliza el tiempo de construcción de mejora de código de bytes (tal vez añadir al menos 1 seg a su tiempo de construcción de una gran proyecto) en lugar de patrón proxy de potencia tiempo de ejecución de la reflexión de hibernación.

Otra cosa que podría encontrar molesto con Hibernate es que una referencia que tiene que lo que cree que es el objeto ... es a menudo un 'proxy' para el objeto. Sin el beneficio de la mejora de código de bytes se requiere que el patrón de proxy para permitir la carga de la demanda (es decir, evitar tirar en todo el gráfico de objetos cuando se tire en un objeto de nivel superior). Esté preparado para sobrescribir equals y hashCode porque el objeto que se cree que está haciendo referencia es a menudo sólo un proxy para ese objeto.

Este es un ejemplo de las frustraciones que obtendrá con Hibernate que no se consigue con JDO:

http: //blog.andrewbeacock .com / 2008/08 / cómo-a-instrumento-hibernación-safe-equals.html
http://burtbeckwith.com/blog/?p=53

Si te gusta la codificación de 'soluciones' a continuación, seguro, Hibernate es para usted. Si usted aprecia orientado a objetos basado en modelos de desarrollo limpio, puro, en el que pasar todo su tiempo en el modelado, diseño y codificación y nada de esto en soluciones feas luego pasar unas horas evaluando JDO / DataNucleus . Las horas invertidos será pagado mil veces.

Actualización de febrero de 2017

Desde hace algún tiempo DataNucleus' implementa el estándar de persistencia JPA, además de la norma persistencia JDO lo que transferir proyectos APP existentes de Hibernate para DataNucleus debe ser muy sencillo y se puede obtener todos los beneficios antes mencionados de DataNucleus con muy poco cambio de código, en su caso. Así que en términos de la cuestión, la elección de una determinada norma, JPA (RDBMS solamente) vs JDO (RDBMS + n + SQL ODBMSes + otros), DataNucleus compatible tanto, Hibernate se limita a JPA solamente.

Rendimiento de cambios Hibernate DB

Otra cuestión a considerar al elegir un ORM es la eficiencia de su mecanismo de comprobación sucia - que se vuelve muy importante cuando se necesita para construir el SQL para actualizar los objetos que han cambiado en la transacción actual - sobre todo cuando hay una gran cantidad de objetos. Hay una descripción técnica detallada del mecanismo de comprobación sucia de Hibernate en esta respuesta, así: JPA con Hibernate insertar muy lento

Recientemente he evaluado y elegido un framework de persistencia para un proyecto Java y mis conclusiones son las siguientes:

Lo que estoy viendo es que el apoyo a favor de la JDO es principalmente:

  • Puede utilizar no son de SQL datasources, db4o, HBase, LDAP, Bigtable, couchdb (plugins para Cassandra), etc.
  • se puede cambiar fácilmente de una fuente de datos SQL para que no sean SQL y viceversa.
  • No hay objetos proxy y, por tanto, menos dolor con respecto a hashCode () y equals () implementaciones
  • más POJO y por lo tanto menos soluciones requerida
  • soporta más de relación y de campo tipos

y el apoyo a favor de la APP es principalmente:

  • más populares
  • JDO está muerto
  • mejora uso doesnt bytecode

Estoy viendo un montón de mensajes a favor de la APP de los desarrolladores de la APP que claramente no han utilizado JDO / DataNucleus ofreciendo argumentos débiles para no usar JDO.

También estoy viendo una gran cantidad de mensajes de usuarios JDO que han emigrado a JDO y son mucho más feliz como resultado.

Con respecto a las APP siendo más popular, parece que esto se debe, en parte, debido al apoyo proveedor RDBMS en lugar de ser técnicamente superior. (Suena como VHS / Betamax para mí).

JDO y es la implementación de referencia DataNucleus es claramente no está muerto, como se muestra por la adopción de Google de la misma para GAE y el desarrollo activo en el código fuente (http://sourceforge.net/projects/datanucleus/).

He visto una serie de quejas sobre JDO debido a la mejora de código de bytes, pero ninguna explicación de por qué todavía es malo.

De hecho, en un mundo que se está volviendo más y más obsesionada por las soluciones NoSQL, JDO (y la implementación DataNucleus) parece una apuesta mucho más segura.

acabo de comenzar a utilizar JDO / DataNucleus y lo ha configurado de modo que pueda cambiar fácilmente entre el uso de db4o y mysql. Es muy útil para el desarrollo rápido de usar db4o y no tener que preocuparse demasiado acerca del esquema de base de datos y luego, una vez que el esquema se estabilizó a implementar en una base de datos. También me siento seguro de que más adelante, podría desplegar todo / parte de mi solicitud a GAE o tomar ventaja de almacenamiento distribuido / mapa-reducir a la hbase / hadoop / Cassandra sin demasiado refactorización.

He encontrado el obstáculo inicial para empezar a usar DataNucleus un poco complicado - La documentación en el sitio web DataNucleus es un poco difícil de conseguir en - los tutoriales no son tan fácilmente a seguir como me hubiera gustado. Una vez dicho esto, la documentación más detallada sobre el API y la cartografía es muy bueno, una vez que llegue más allá de la curva de aprendizaje inicial.

La respuesta es, depende de lo que desea. Yo preferiría tener un código más limpio, no-proveedor-lock-in, más, opciones NoSQL POJO orientado versos más popular.

Si desea que la sensación cálida molesto de que está haciendo lo mismo que la mayoría de otros desarrolladores / ovejas, elija APP / hibernación. Si quieres llevar en su campo, prueba de conducción de JDO / DataNucleus y hacer su propia mente.

  

¿Qué sugiere usted para un nuevo proyecto?

Yo sugeriría tampoco! Utilice JdbcTemplate de primavera DAO junto con StoredProcedure, RowMapper y RowCallbackHandler lugar.

Mi propia experiencia personal con Hibernate es que el tiempo ahorrado por adelantado es más que compensado por los interminables días que pasará por la línea tratando de entender y depurar problemas como el comportamiento inesperado de actualización en cascada.

Si está utilizando una base de datos relacional a continuación, cuanto más cerca su código es a él, el mayor control que tiene. capa DAO de resorte permite un control fino de la capa de mapeo, mientras que la eliminación de la necesidad de código repetitivo. Además, se integra en la capa de transacción de Primavera que significa que puede añadir muy fácilmente (a través de AOP) comportamiento transaccional complicada sin este entrometerse en su código (por supuesto, usted consigue esto con Hibernate también).

JDO está muerto

JDO no está muerto en realidad, así que por favor verifique sus datos.JDO 2.2 fue lanzado en Octubre de 2008 JDO 2.3 se encuentra en desarrollo.

Esto es desarrollado abiertamente, bajo Apache.Más versiones de JPA ha tenido, y su ORM especificación está aún por adelantado, incluso de la JPA2 características propuestas

JDO está teniendo características avanzadas que JPA ver http://db.apache.org/jdo/ jdo_v_jpa.html

Estoy usando la APP (aplicación OpenJPA de Apache que se basa en el código base Kodo JDO que es 5+ años y extremadamente rápido / fiable). En mi humilde opinión nadie que le diga a pasar por alto las especificaciones que está dando un mal consejo. Pongo el tiempo dentro y estaba definitivamente recompensado. Con cualquiera de JDO o JPA se puede cambiar de proveedor con cambios mínimos (APP tiene mapeo ORM por lo que estamos hablando de menos de un día para cambiar posiblemente vendedores). Si usted tiene más de 100 mesas como yo esto es enorme. Además te dan built0in almacenamiento en caché de desalojo de caché de racimo-sabia y todo es bueno. SQL / JDBC está muy bien para las consultas de alto rendimiento pero la persistencia transparente es muy superior para escribir sus algoritmos y rutinas de entrada de datos. Sólo tengo cerca de 16 consultas SQL en toda mi sistema (50k + líneas de código).

Cualquier persona que dice que está muerto JDO es un traficante astroturfing FUD y ellos lo saben.

JDO está vivo y bien. La especificación es aún más potente, madura y avanzada que la APP mucho más joven y limitado.

Si desea limitarse sólo a lo que está disponible en el estándar JPA puede escribir a la APP y el uso de DataNucleus como un alto rendimiento, la implementación de persistencia más transparentes que las otras implementaciones de JPA. Por supuesto DataNucleus también implementa el estándar JDO si desea que la flexibilidad y la eficiencia de los modelos que trae JDO.

He estado buscando en esto mismo y no puedo encontrar una fuerte diferencia entre los dos. Creo que la gran elección es en el que la aplicación que utilice. En cuanto a mí He estado considerando la DataNucleus plataforma ya que es un almacén de datos de aplicación agnóstico de ambos.

He usado Hibernate (aplicación APP) y JPOX (implementación de JDO) en el mismo proyecto. JPOX funcionaba bien, pero se encontró con errores con bastante rapidez, hay donde algunos de Java 5 funciones de idioma que no apoyó en el momento. Tenía problemas al reproducir agradable con transacciones XA. Yo estaba generando el esquema de base de datos de los objetos de JDO. Se quería conectarse a una base de datos cada vez que es molesto si su conexión a Oracle no sucede se trabaja.

A continuación, cambiamos a Hibernate. Jugamos un poco con sólo usar pura APP por un tiempo, pero tuvimos que utilizar algunas de las características específicas de Hibernate para hacer el mapeo. Al ejecutar el mismo código en múltiples bases de datos es muy fácil. Hibernate parece almacenar en caché los objetos de forma agresiva o simplemente tienen un comportamiento de almacenamiento en caché extraño a veces. Hay unos pocos DDL construye Hibernate no puede manejar y por lo que se definen en un archivo adicional que se ejecuta para inicializar la base de datos. Cuando me he encontrado con un problema de hibernación a menudo hay muchas personas que se han topado con el mismo problema que hace google para soluciones más sencillas. Por último, Hibernate parece estar bien diseñado y fiable.

Algunos otros han sugerido que responden simplemente utilizando SQL. El caso de uso verdadero asesino de mapeo objeto relacional es pruebas y desarrollo. Las bases de datos que se construyen para manejar grandes volúmenes de datos suelen ser caros y o son difíciles de instalar. Son difíciles de probar con. Hay un montón de bases de datos Java en memoria que se pueden utilizar para probar con, pero por lo general son inútiles para la producción. Ser capaz de utilizar una base de datos real, pero limitada, aumentará la productividad de desarrollo y fiabilidad código.

He hecho una aplicación web de ejemplo en de mayo de 2012, que utiliza JDO 3.0 y 3.0 DataNucleus - echar un vistazo lo limpio que es: https://github.com/TorbenVesterager/BadAssWebApp

Está bien tal vez es un poco demasiado limpio, porque el uso de los POJOs tanto para la base de datos y el cliente JSON, pero es divertido:)

PS: Contiene un par de anotaciones SuppressWarnings (desarrollado en IntelliJ 11)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top