2011-03-07 12 views
5

¿Cuál es la razón detrás de este comportamiento?¿Por qué Hibernate solo Auto-Flush dentro de una transacción?

Si por alguna razón ejecuto dos operaciones adecuadas fuera de una transacción (no se recomienda, ya sé!) Y he configurado Hibernate para el auto-vaciado, me esperaba para el auto-vaciado si la segunda operación es uno que debe desencadenar un auto-flush (como list, iterate o executeUpdate).

eso es exactamente lo que sucedería, si no fuera por la comprobación explícita en la segunda línea del método autoFlushIfRequried:

protected boolean autoFlushIfRequired(Set querySpaces) throws HibernateException { 
    errorIfClosed(); 
    if (! isTransactionInProgress()) { 
     // do not auto-flush while outside a transaction 
     return false; 
    } 
    AutoFlushEvent event = new AutoFlushEvent(querySpaces, this); 
    AutoFlushEventListener[] autoFlushEventListener = listeners.getAutoFlushEventListeners(); 
    for (int i = 0; i < autoFlushEventListener.length; i++) { 
    autoFlushEventListener[i].onAutoFlush(event); 
    } 
    return event.isFlushRequired(); 
} 

actualización: Gracias axtavt para encontrar el problema de Hibernate que llevó a este cambio (en 3.2): FlushMode.AUTO -> COMMIT when outside a transaction.

Todavía hay un problema relacionado abierto: delay IDENTITY insertions in the case of FlushMode.MANUAL/NEVER, pero ninguno de los dos comentarios proporciona la justificación para decir "Cuando se opera fuera de una transacción, FlushMode.AUTO es algo malo".

+1

_¿Cuándo_ esperas que sea autoflush? – axtavt

+0

@axtavt - He actualizado mi pregunta para que sea un poco más específica. Espero que se descargue automáticamente si realizo una operación que normalmente se vacía automáticamente, como 'list',' iterate', o 'executeUpdate'. No entiendo la relevancia de las transacciones para el código anterior. –

+0

He visto y votado a favor. Los chicos de Hibernate dicen que "es algo malo": http://opensource.atlassian.com/projects/hibernate/browse/HHH-1410 – axtavt

Respuesta

2

Debido a que el docummentation para FlushMode dice

la sesión es a veces volcado antes de la ejecución de consultas con el fin de garantizar que las consultas no vuelven estado rancio. Este es el modo de descarga predeterminado.

Por lo tanto, auto no significa lo que usted piensa que significa. El nombre es, sin dudas, mal elegido, pero no significa que se realice una descarga después de cada operación de sesión. Por lo tanto, no es similar a la confirmación automática de JDBC, que realiza una declaración de compromiso después de cada JDBC.

Cuestiones relacionadas