hibernate - que - Hibernar: ¿cómo deshabilitar el guardado automático de objetos sucios?
desactivar autoguardado whatsapp android 2018 (2)
Me sorprendió bastante descubrir que Hibernate guarda automáticamente los objetos sucios al final de la transacción, sin llamadas explícitas a algo como
dao.save(object)
Tengo en mente la situación descrita por este hilo.
Mi pregunta es: ¿hay una manera de deshabilitar este comportamiento? A primera vista, este ahorro automático parece bastante peligroso porque necesita saber qué objetos están conectados a la sesión y cuáles no, y parece bastante fácil guardar algo por error. ¿Puede decirme cuáles son los beneficios de este enfoque de ahorro automático? Apenas veo ninguno. Me gustaría siempre llamar explícitamente a dao.save (objeto) para actualizar cualquier cosa.
He oído hablar de una posible solución a esto, que es usar un entityInterceptor en su sessionFactory. Este entityInterceptor personalizado anularía el método findDirty para nunca encontrar nada sucio, pero en tal caso, supongo que dao.save no funcionará. ¿Algunas ideas?
Estoy de acuerdo, no debes tirar manualmente. Mi experiencia con el desarrollador de aplicaciones web dijo que FushMode debería estar configurado en "AUTO". Pero a veces necesito deshabilitar la verificación sucia (para la validación de datos, validación de datos en la base de datos y devolución de datos por formularios o servicios). Para eso creo una clase especial y una comprobación sucia deshabilitada cambiando el FLUSHMODE
@Component
public class ValidateRefPaysService implements IValidateRefPaysService {
...
@Autowired
@Qualifier("sessionFactory")
private SessionFactory sessionFactory;
@Override
@Transactional(readOnly=true)
public void validate(RefPays refPays) throws BusinessException {
try {
sessionFactory.getCurrentSession().setFlushMode(FlushMode.MANUAL);
if ( refPays.getId() != null ) {
RefPays refPaysBase = refPaysDAO.getById(refPays.getId());
if ( refPaysBase != null ) {
throw new BusinessException("L''id already exists in database.", "RefPays.savePays.id.alreadyexist", "refPays.savePays.id.alreadyexist");
}
}
} finally {
sessionFactory.getCurrentSession().setFlushMode(FlushMode.AUTO);
}
}
}
Para deshabilitar la administración automática de estado, configure el modo de descarga en su sesión en MANUAL. Luego puede llamar a session.flush () para escribir realmente todas las entidades sucias asociadas con su sesión.