saveorupdate interfaz generic example entidad ejemplo java hibernate methods dao

java - interfaz - Error de eliminación de hibernación: Actualización por lotes devuelta recuento de filas inesperado



interfaz dao (8)

El error puede ser causado por varias cosas. No estoy tomando el crédito por eso, lo encontré here .

  1. El vaciado de los datos antes de confirmar el objeto puede llevar a borrar todos los objetos pendientes de persistencia.
  2. Si el objeto tiene una clave principal que se genera automáticamente y está forzando una clave asignada
  3. si está limpiando el objeto antes de comprometer el objeto a la base de datos.
  4. Cero o ID incorrecta: si establece el ID en cero o algo más, Hibernate intentará actualizar en lugar de insertar.
  5. Object is Stale: Hibernate almacena en caché objetos de la sesión. Si se modificó el objeto y Hibernate no lo conoce, lanzará esta excepción: observe la excepción StaleStateException

También mire esta respuesta por beny23 que brinda algunos consejos adicionales para encontrar el problema.

  • En su configuración de hibernación, establezca hibernate.show_sql en verdadero. Esto debería mostrarle el SQL que se ejecuta y causa el problema.
  • Establezca los niveles de registro para Spring e Hibernate en DEBUG, nuevamente esto le dará una mejor idea de qué línea causa el problema.
  • Cree una prueba de unidad que replique el problema sin configurar un administrador de transacciones en Spring. Esto debería darle una mejor idea de la línea de código ofensiva.

Escribí este método a continuación, que se supone que elimina un registro de miembro de la base de datos. Pero cuando lo uso en mi servlet me devuelve un error.

Clase de miembro

public static void deleteMember(Member member) { Session hibernateSession = HibernateUtil.getSessionFactory().getCurrentSession(); Transaction tx = hibernateSession.beginTransaction(); hibernateSession.delete(member); tx.commit(); }

Parte del controlador

if(delete != null) { HttpSession httpSession = request.getSession(); Member member = (Member) httpSession.getAttribute("member"); MemberDao.deleteMember(member); nextPage = "ledenlijst.jsp"; }

Estado HTTP 500

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

A veces incluso produce este error cuando intento ejecutar la página varias veces.

org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update

¿Alguien sabe exactamente qué está causando estos errores?


En mi caso, esta excepción fue causada por un mapeo de entidades incorrecto. No hubo una cascada para la relación, y la entidad secundaria referenciada no se guardó antes de intentar hacer referencia a ella desde el padre. Cambiándolo a

@OneToMany(cascade = CascadeType.ALL)

arreglado el problema.

Seguramente la mejor manera de encontrar la causa de esta excepción es establecer los niveles de show_sql y DEBUG para los registros, se detendrá justo en el sql que causó el problema.


Esta es la solución para mi caso, tal vez te ayude!

En realidad, fue un problema de conversión entre un tipo de campo de base de datos (marca de tiempo en postgreSQL) y su tipo de propiedad equivalente (Calendario) en el archivo xml de hibernación. Cuando Hibernate hizo esta solicitud de actualización, no recuperó la fila porque la solicitud se interroga con un valor de calendario de conversión incorrecto. Así que simplemente reemplacé el tipo de propiedad "Calendario" en "Fecha" en el archivo XML de Hibernate y el problema se solucionó.


Estaba enfrentando el mismo problema. El código estaba trabajando en el entorno de prueba. Pero no estaba funcionando en un entorno de puesta en escena.

org.hibernate.jdbc.BatchedTooManyRowsAffectedException: Batch update returned unexpected row count from update [0]; actual row count: 3; expected: 1

El problema era que la tabla tenía una entrada única para cada clave principal en la prueba de la tabla DB. Pero en la base de datos DB había varias entradas para la misma clave principal. (El problema está en el DB de ensayo, la tabla no tenía ninguna restricción de clave principal, también hubo varias entradas).

Así que cada vez que en la operación de actualización falla. Intenta actualizar el registro único y espera obtener el recuento de actualizaciones como 1. Pero dado que había 3 registros en la tabla para la misma clave principal, el recuento de actualizaciones de resultados encuentra 3. Dado que el recuento de actualizaciones esperado y el recuento de actualizaciones de resultados reales no coincidieron , Lanza la excepción y retrocede.

Después de que eliminé todos los registros que tienen clave principal duplicada y agregé restricciones de clave principal. Está funcionando bien.


Experimenté este mismo problema con hibernate / JPA 2.1 al usar memcached como caché secundario. Obtendría la excepción anterior junto con una StaleStateException. La resolución fue diferente a lo que se ha señalado anteriormente.

Noté que si tiene una operación que intercala elimina y selecciona (encuentra) dentro de la misma tabla y transacción, la hibernación puede abrumarse e informar esa excepción de estado obsoleto. Solo nos ocurriría durante la producción, ya que en la misma tabla se producirían múltiples operaciones idénticas en diferentes entidades. Vería el tiempo de espera del sistema y lanzar excepciones.

La solución es simplemente ser más eficiente. En lugar de intercalar en un bucle, intente resolver qué elementos deben leerse y hacerlo, preferiblemente en una operación. Luego realice la eliminación en una operación separada. Nuevamente, todos en la misma transacción, pero no salpique la hibernación con las operaciones de lectura / eliminación / lectura / eliminación.

Esto es mucho más rápido y reduce considerablemente la carga de mantenimiento en Hibernate. El problema se fue. Esto ocurre cuando está utilizando un caché secundario y no ocurrirá de otra manera, ya que la carga estará en la base de datos para su resolución sin un caché secundario. Ese es otro tema.


He tenido este problema,

Verifiqué mi código, no hubo ningún problema, pero cuando revisé mis datos descubrí que tenía dos entidades con la misma identificación.

Entonces, la flush() no pudo funcionar, porque funciona una por una para las actualizaciones por lotes y encontró 2 filas. Por lo tanto, no se actualizó y arrojó una excepción, pero fue mi problema. ¡No sé si te funciona bien o no!


La excepción org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 solía ser lanzado cuando Hibernate se da cuenta de que la entidad que desea descargar a la base de datos no es exactamente como estaba al comienzo de la transacción.

Describí más detalladamente dos casos de uso diferentes que me suceden here .


Recientemente experimenté esto y lo que sucedió fue que usé el método de actualización y estaba lanzando una excepción porque no había un registro existente. Cambié el método a saveOrUpdate. Funcionó.