¿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".
_¿Cuándo_ esperas que sea autoflush? – axtavt
@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. –
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