java - begin - Entitymanager.flush() VS EntityManager.getTransaction(). Commit-¿Qué debería preferir?
entitymanager gettransaction commit (5)
¿Leyó el javadoc para el color y se compromete y sabe que el color solo se puede usar en una transacción? Se vacía (pero no confirma), mientras que commit comete datos (obviamente). Ellos son distintos; no hay una "preferencia" que se tenga. El primer ejemplo es incorrecto y debería dar como resultado una excepción al invocar flush (TransactionRequiredException)
¿Qué debería preferir al actualizar la base de datos? ¿Cuáles son los pros y contras con cualquier método y cuándo debo usar uno u otro?
public void disemployEmployee(Integer employeeId, Date endDate) {
Employee employee = (Employee)em.find("Employee", employeeId);
employee.getPeriod().setEndDate(endDate);
em.flush();
}
public void disemployEmployee(Integer employeeId, Date endDate) {
Employee employee = (Employee)em.find("Employee", employeeId);
em.getTransaction().begin();
employee.getPeriod().setEndDate(endDate);
em.getTransaction().commit();
}
Ambos ejemplos de código no persisten o fusionan el estado de la entidad para escribir en DB.
No creo apropiado comparar EntityManager.flush()
y EnityManager.EntityTransaction.commit()
.
flush () DEBE incluirse en un contexto de transacción y no tiene que hacerlo explícitamente a menos que sea necesario (en casos excepcionales), cuando EntityTransaction.commit () hace eso por usted.
Consulte este enlace. ¿Es necesario llamar a flush () (interfaz JPA) en esta situación?
Consulte este enlace Pregunta sobre el lavado con JPA antes de que se solicite una consulta para que un escenario use flush ()
Creo que la parte que falta es, flush () solo agregar a las fuentes de datos para estar listo para confirmar, da los identificadores reales pero no persisten por defecto.
Por lo tanto, si necesita que flush () funcione como commit (), debe configurar el modo de descarga en Commit in the EntityManager de la siguiente manera:
void setFlushMode(FlushModeType flushMode)
Set the flush mode that applies to all objects contained in the persistence context.
Tenga en cuenta que FlushModeType es una enumeración que tiene estos dos valores:
FlushModeType AUTO (Predeterminado) Flushing para que se produzca en la ejecución de la consulta. Dado que: JPA 1.0 FlushModeType COMMIT Flushing se produce en el compromiso de transacción. El proveedor puede tirar en otro momento, pero no está obligado a hacerlo. Desde: JPA 1.0
Espero que esta ayuda
En su primer ejemplo, los cambios en los datos se reflejan en la base de datos después de encontrar el color, pero todavía está en la transacción.
Pero en el segundo ejemplo, estás comprometiendo la transacción de inmediato. Por lo tanto, los cambios se realizan en la base de datos y la transacción también finaliza allí.
A veces, el color puede ser útil para conservar los datos entre la transacción en curso y luego finalmente confirmar los cambios. Por lo tanto, también puede deshacer los cambios anteriores si luego surge algún problema, como por ejemplo, para la inserción / actualización de lotes.
Me gustaría ir a la transacción administrada de contenedores siempre que sea posible. Las transacciones administradas de frijol usualmente requieren significativamente más código, debido a las posibilidades de Excepción. Además, es más propenso a errores (reversiones, administración de recursos).
Dicho esto, utilizaría un color después de la confirmación en el modo de contenedor administrado. De esta forma, puedo detectar posibles PersistenceExceptions en mi módulo de almacenamiento y convertirlo en una Excepción más significativa para mi módulo de casos de uso. Esto porque no quiero manejar excepciones específicas de almacenamiento aquí, porque podría intercambiar el módulo de almacenamiento por algo que no utiliza JPA ... que nunca me pasó :)