Esta es una pregunta de diseño, código concreto no enviado para proteger mi parte inferior.org.hibernate.Session.clear() considerado Dañino?
Cuando se trabaja con Hibernate el flujo de trabajo estándar es la siguiente:
- Sesión Abierta
- iniciar la transacción
- hacer el negocio (leer y modificar datos)
- confirmar la transacción
- Cerrar Sesión
con posiblemente iteraciones a través de 2-4.
¿Cuáles son los casos de uso razonables para Session.clear()?
A: El problema concreto que tengo es una (gran) pieza de código que carga y modifica entidades, luego borra (n) la sesión, esencialmente desechando los cambios que se hicieron. (La tarea comercial que debe realizarse no incluye la modificación de las entidades, por lo que el código "funciona").
Me parece que el diseño correcto sería asegurarse de que el código (grande) no haga cambios que no quiera guardar.
B: Supongo que Session.clear() existe por conveniencia/flexibilidad, no porque sea una buena idea usarlo.
¿He entendido mal la filosofía de Hibernate?
C: Subestación: ¿Es una mala idea que el código del marco elimine incondicionalmente() la sesión cuando se completa una tarea? En mi humilde opinión, el marco debería quejarse si la sesión está sucia cuando se completa una tarea. La sesión debe cerrarse, ya que la tarea está terminada ... (Sin tener en cuenta el rendimiento por minuto)
(Etiquetas A, B y C para que pueda indicar qué parte está respondiendo).
ad A): El procesamiento de grandes conjuntos de datos en una transacción me parece un mal diseño (sin embargo, es posible que no haya pensado en todos los posibles problemas ...). ¿Qué quiere decir con persistir "explícitamente" en una entidad? session.save (entidad)? Ad C): Parece que estamos de acuerdo en que los marcos no deberían hacer esto: el marco no puede estar seguro de qué hacen los clientes. :-) –
@MortenLauritsenKhodabocus: obviamente, cargar y modificar miles de registros en una transacción de Hibernate es una señal de que se debe usar una herramienta diferente. Sí, por * explícitamente * Me refiero a llamar a 'save()' en lugar de dejar que Hibernate descubra entidades sucias. –
@MortenLauritsenKhodabocus Por favor, ilumíname. ¿Por qué sería una mala idea procesar un gran conjunto de datos de solo lectura en una transacción? Me parece que si se trata de ordenar por el lado de la base de datos, sería inteligente, ya que evitaría tener que reordenar varias veces. ¿El hecho de no usar una transacción significa que el DB recordará su estado ordenado a través de diferentes consultas que son parte de la misma transacción? Además, ¿no es 'usar una transacción' exactamente lo que hace la API ScrollableResults de Hibernate? – KyleM