type strategy generationtype generation generatedvalue example sql mysql hibernate transactions counter

sql - strategy - id hibernate



Actualización de contadores a través de Hibernate (2)

Esta es una situación extremadamente común, así que estoy esperando una buena solución. Básicamente, necesitamos actualizar los contadores en nuestras tablas. Como ejemplo, una visita a la página web:

Web_Page -------- Id Url Visit_Count

Entonces, en Hibernate, podríamos tener este código:

webPage.setVisitCount(webPage.getVisitCount()+1);

El problema allí es lee en mysql por defecto no preste atención a las transacciones. Por lo tanto, una página web de alto tráfico tendrá recuentos inexactos.

La forma en que estoy acostumbrado a hacer este tipo de cosas es simplemente llamar:

update Web_Page set Visit_Count=Visit_Count+1 where Id=12345;

Supongo que mi pregunta es, ¿cómo hago eso en Hibernate? Y en segundo lugar, ¿cómo puedo hacer una actualización como esta en Hibernate, que es un poco más compleja?

update Web_Page wp set wp.Visit_Count=(select stats.Visits from Statistics stats where stats.Web_Page_Id=wp.Id) + 1 where Id=12345;


El problema allí es lee en mysql por defecto no preste atención a las transacciones. Por lo tanto, una página web de alto tráfico tendrá recuentos inexactos.

En efecto. Utilizaría una operación de estilo DML aquí (ver el capítulo 13.4 Operaciones de estilo DML ):

Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlUpdate = "update webPage wp set wp.visitCount = wp.visitCount + 1 where wp.id = :id"; int updatedEntities = s.createQuery( hqlUpdate ) .setLong( "newName", 1234l ) .executeUpdate(); tx.commit(); session.close();

Que debería resultar en

update Web_Page set Visit_Count=Visit_Count+1 where Id=12345;

Y en segundo lugar, ¿cómo puedo hacer una actualización como esta en Hibernate, que es un poco más compleja?

Hmm ... estoy tentado de decir "estás jodido" ... necesito pensar más sobre esto.


Un procedimiento almacenado ofrece varios beneficios:

  1. En caso de que el esquema cambie, el código no necesita cambiar si se trata de un call increment($id)
  2. Los problemas de concurrencia pueden ser localizados.
  3. Una ejecución más rápida en muchos casos.

Una posible implementación es:

create procedure increment (IN id integer) begin update web_page set visit_count = visit_count + 1 where `id` = id; end