java - generic - Hibernate o JDBC
hibernate.cfg.xml example (9)
... Sesión en memoria ... LazyInitializationException ...
Puedes ver Ebean ORM que no usa objetos de sesión ... y donde la carga lenta simplemente funciona. Sin duda una opción, no demasiado, y será más simple de entender.
Tengo un cliente grueso, aplicación Java swing con un esquema de 25 tablas y ~ 15 JInternalFrames (formularios de entrada de datos para las tablas). Necesito hacer una elección de diseño de JDBC directo o ORM (hibernar con marco de primavera en este caso) para la interacción de DBMS. La construcción de la aplicación ocurrirá en el futuro.
¿Hibernaría sería excesivo para un proyecto de este tamaño? Una explicación de sí o no sería muy apreciada (o incluso un enfoque diferente, si está justificado).
TIA.
En JDBC, si abrimos una conexión a una base de datos, debemos escribir en try, y si se produce alguna excepción, el bloque lo tomará y finalmente se usará para cerrar las conexiones.
En jdbc todas las excepciones son excepciones marcadas, por lo que debemos escribir el código en try, catch y throws, pero en hibernate solo tenemos excepciones no marcadas.
¡Aquí como programador debemos cerrar la conexión, o podemos tener la oportunidad de obtener nuestro mensaje de conexiones ...!
En realidad, si no cerramos la conexión en el bloque finally, entonces jdbc no es responsable de cerrar esa conexión.
En JDBC necesitamos escribir comandos Sql en varios lugares, después de que el programa haya creado si la estructura de la tabla se ha modificado, entonces el programa JDBC no funciona, de nuevo tenemos que modificar y compilar y volver a implementar requerido, lo cual es tedioso.
JDBC solía generar códigos de error relacionados con la base de datos si se produce una excepción, pero los programadores de Java son desconocidos sobre este código de error.
Mientras estamos insertando cualquier registro, si no tenemos ninguna tabla en particular en la base de datos, JDBC levantará un error como "Ver no existir", y lanzará una excepción, pero en caso de hibernación, si no encuentra ninguna tabla en el base de datos esto creará la tabla para nosotros
JDBC admite carga LAZY e Hibernate admite carga Eager
Hibernate admite Herencia, Asociaciones, Colecciones
En hibernar si guardamos el objeto de clase derivado, su objeto de clase base también se almacenará en la base de datos, significa hibernación que admite la herencia
Hibernate admite relaciones como One-To-Many, One-To-One, Many-To-Many-to-Many, Many-To-One
Hibernate admite el mecanismo de almacenamiento en caché mediante esto, se reducirá el número de viajes de ida y vuelta entre una aplicación y la base de datos, mediante el uso de esta técnica de almacenamiento en caché se aumentará automáticamente el rendimiento de la aplicación
Obtener paginación en Hibernate es bastante simple.
Hibernate tiene la capacidad de generar claves primarias automáticamente mientras almacenamos los registros en la base de datos
Buena pregunta sin una sola respuesta simple.
Solía ser un gran admirador de Hibernate después de usarlo en múltiples proyectos durante varios años. Solía creer que cualquier proyecto debe hibernar por defecto.
Hoy no estoy tan seguro.
Hibernate (y JPA) es ideal para algunas cosas, especialmente al principio del ciclo de desarrollo. Es mucho más rápido acceder a algo que funciona con Hibernate que con JDBC. Obtienes muchas funciones de forma gratuita: almacenamiento en caché, bloqueo optimista, etc.
Por otro lado, tiene algunos costos ocultos. Hibernate es engañosamente simple cuando comienzas . Sigue algunos tutoriales, escribe algunas anotaciones en tu clase y obtienes persistencia. Pero no es simple y para poder escribir un buen código requiere una buena comprensión tanto del funcionamiento interno como del diseño de la base de datos. Si recién está empezando, puede que no esté al tanto de algunos problemas que pueden morderle más adelante, por lo que aquí hay una lista incompleta.
Actuación
El rendimiento del tiempo de ejecución es suficientemente bueno, aún no he visto una situación en la que la hibernación sea la razón del bajo rendimiento en la producción . El problema es el rendimiento de inicio y cómo afecta el tiempo de prueba de la unidad y el rendimiento de desarrollo. Cuando carga hibernación, analiza todas las entidades y realiza una gran cantidad de precaching: puede tardar de 5 a 15 segundos para una aplicación no muy grande. Entonces tu prueba de 1 segundo de unidad va a tomar 11 segundos ahora. No es divertido.
Independencia de la base de datos
Es genial siempre y cuando no necesites hacer ajustes en la base de datos.
Sesión en memoria
Para cada transacción, Hibernate almacenará un objeto en la memoria para cada fila de la base de datos que "toque". Es una buena optimización cuando estás haciendo una simple entrada de datos. Sin embargo, si necesita procesar muchos objetos por algún motivo, puede afectar seriamente el rendimiento, a menos que usted limpie explícita y cuidadosamente la sesión en memoria por su cuenta.
Cascadas
Las cascadas le permiten simplificar el trabajo con gráficos de objetos. Por ejemplo, si tiene un objeto raíz y algunos elementos secundarios y guarda el objeto raíz, puede configurar también hibernación para guardar elementos secundarios. El problema comienza cuando su gráfico de objetos se vuelve complejo. A menos que sea extremadamente cuidadoso y comprenda bien lo que sucede internamente, es fácil estropearlo. Y cuando lo haces es muy difícil depurar esos problemas.
Carga lenta
La carga diferida significa que cada vez que carga un objeto, hibernate no cargará todos sus objetos relacionados, sino que proporcionará marcadores de posición que se resolverán tan pronto como intente acceder a ellos. Gran optimización, ¿verdad? Lo es, excepto que debe ser consciente de este comportamiento; de lo contrario, obtendrá errores crípticos. Google "LazyInitializationException" para un ejemplo. Y ten cuidado con el rendimiento. Dependiendo del orden de cómo cargue sus objetos y su gráfico de objetos, puede presionar "n + 1 selecciona problema". Google para obtener más información.
Actualizaciones de esquema
Hibernate permite cambios de esquema fáciles simplemente refactorizando el código java y reiniciando. Es genial cuando comienzas Pero luego liberas la versión uno. Y a menos que desee perder a sus clientes, debe proporcionarles scripts de actualización de esquema. Lo que significa que no hay más refactorización simple, ya que todos los cambios de esquema se deben hacer en SQL.
Vistas y procedimientos almacenados
Hibernate requiere acceso exclusivo de escritura a los datos con los que trabaja. Lo que significa que no puede usar vistas, procedimientos almacenados y desencadenantes, ya que pueden provocar cambios en los datos y hibernación no los conoce. Puede tener algunos procesos externos escribiendo datos en la base de datos en transacciones separadas. Pero si lo hace, su caché tendrá datos inválidos. Cuál es una cosa más para preocuparse.
Sesiones de un solo subproceso
Las sesiones de Hibernate tienen un solo hilo. Cualquier objeto cargado a través de una sesión solo se puede acceder (incluida la lectura) desde el mismo hilo. Esto es aceptable para aplicaciones del lado del servidor pero puede complicar cosas innecesarias si está haciendo una aplicación basada en GUI.
Supongo que mi punto es que no hay comidas gratuitas.
Hibernate es una buena herramienta, pero es una herramienta compleja y requiere tiempo para entenderla correctamente. Si usted o los miembros de su equipo no tienen ese conocimiento, podría ser más simple y más rápido ir con JDBC puro (o Spring JDBC) para una sola aplicación. Por otro lado, si está dispuesto a invertir tiempo en aprenderlo (incluyendo aprender haciendo y depurando) que en el futuro, podrá comprender mejor las ventajas y desventajas.
Creo que cualquiera es una buena elección, pero personalmente usaría Hibernate. No creo que Hibernate sea excesivo para un proyecto de ese tamaño.
Donde Hibernate realmente brilla para mí es lidiar con las relaciones entre entidades / tablas. Hacer JDBC a mano puede tomar un montón de código si se trata de modificar padres e hijos (nietos, hermanos, etc.) al mismo tiempo. Hibernate puede hacer que esto sea pan comido (a menudo basta con guardar solo la entidad principal).
Sin embargo, hay ciertas complejidades cuando se trata con Hibernate, como entender cómo funciona el lavado de la sesión y lidiar con la carga diferida.
Hibernate puede ser bueno, pero él y otros ORM de JPA tienden a dictar la estructura de su base de datos hasta cierto punto. Por ejemplo, las claves primarias compuestas se pueden hacer en Hibernate / JPA pero son un poco incómodas. Hay otros ejemplos.
Si te sientes cómodo con SQL, te sugiero encarecidamente que Ibatis un vistazo a Ibatis . Puede hacer el 90% más de lo que Hibernate puede, pero es mucho más simple en la implementación.
No puedo pensar en una sola razón por la que alguna vez elegiría directamente JDBC (o incluso Spring JDBC) sobre Ibatis. Hibernate es una opción más compleja.
Eche un vistazo al Tutorial de Spring and Ibatis .
Los mejores trajes de Hibernate para las aplicaciones de middleware. Supongamos que construimos un software intermedio en la parte superior de la base de datos. Se puede acceder al middelware con alrededor de 20 aplicaciones, en ese caso podemos tener un hibernate que satisfaga los requisitos de las 20 aplicaciones.
Sin duda, Hibernate tiene su complejidad.
Pero lo que realmente me gusta del enfoque de Hibernate (algunos otros también) es que el modelo conceptual que puedes obtener en Java es mejor. Aunque no creo que OO sea una panacea, y no busco la pureza crítica del diseño, muchas veces descubrí que OO simplifica mi código. Como solicitó específicamente detalles, aquí hay algunos ejemplos:
la complejidad añadida no está en el modelo y las entidades, sino en su marco para manipular todas las entidades, por ejemplo. Para los mantenedores, la parte difícil no son unas pocas clases de framework sino su modelo, por lo que Hibernate le permite mantener la parte más dura (el modelo) en su forma más limpia.
si se usa un campo (como un id, o campos de auditoría, etc.) en todas sus entidades, puede crear una superclase con él. Por lo tanto :
- escribes menos código, pero lo más importante ...
- hay menos conceptos en su modelo (el concepto único es único en el código)
- de forma gratuita, puede escribir código más genérico, que se proporciona con una entidad (desconocido, sin cambio de tipo o conversión), le permite acceder a la identificación.
Hibernate también tiene muchas características para tratar con otras características del modelo que pueda necesitar (ahora o más adelante, agréguelas solo según sea necesario). Tómelo como una calidad de extensibilidad para su diseño.
- Puede reemplazar la herencia (subclases) por composición (varias entidades que tienen un mismo miembro, que contiene algunos campos relacionados que resultan necesarios en varias entidades).
- Puede haber herencia entre algunas de sus entidades. A menudo sucede que tiene dos tablas que tienen prácticamente la misma estructura (pero no desea almacenar todos los datos en una tabla, porque perderá integridad referencial en una tabla padre diferente).
Con la reutilización entre sus entidades (pero solo la herencia apropiada y la composición ), generalmente hay algunas ventajas adicionales por venir. Ejemplos:
- a menudo hay alguna manera de leer los datos de las entidades que es similar pero diferente. Supongamos que leo el campo "título" para tres entidades, pero para algunos reemplazo el resultado con un valor predeterminado diferente si es nulo. Es fácil tener una firma "getActualTitle" (en una superclase o una interfaz) e implementar el manejo de valor predeterminado en las tres implementaciones. Eso significa que el código de mis entidades solo trata con el concepto de un "título real" (expliqué explícitamente este concepto funcional), y la herencia del método se encarga de ejecutar el código correcto (no más interruptores o si no hay duplicación de códigos) .
- ...
Con el tiempo, los requisitos evolucionan. Habrá un punto donde la estructura de su base de datos tiene problemas. Con JDBC solo, cualquier cambio en la base de datos debe afectar el código (es decir, doble costo). Con Hibernate, muchos cambios pueden ser absorbidos cambiando solo el mapeo, no el código. Lo mismo ocurre al revés: Hibernate le permite cambiar su código (entre versiones, por ejemplo) sin alterar su base de datos (cambiando la asignación, aunque no siempre es suficiente). En resumen, Hibernate le permite evolucionar su base de datos y su código de forma independiente .
Por todos estos motivos, elegiría Hibernate :-)
Straight JDBC se ajustaría a los casos más simples en el mejor de los casos.
Si desea permanecer dentro de Java y OOD, entonces debe elegir Hibernate o Hibernate / JPA o cualquier otro proveedor de JPA / JPA.
Si está más cómodo con SQL, tener Spring para plantillas JDBC y otros frameworks orientados a SQL no le hará daño.
En contraste, además del control transaccional, no hay mucha ayuda de Spring al trabajar con JPA.
si miles de millones de usuarios usan la aplicación o la web, en la consulta jdbc se ejecutarán miles de millones de tiempo, pero en la consulta de hibernación se ejecutará solo una vez para cualquier número de usuarios, la ventaja más importante y fácil de hibernate sobre jdbc.