2010-05-25 8 views
7

Jest to sytuacja bardzo często spotykana, więc spodziewam się dobrego rozwiązania. Zasadniczo musimy zaktualizować liczniki w naszych tabelach. Jako przykład odwiedzenia strony internetowej:Aktualizacja liczników przez Hibernate

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

Więc w hibernacji, możemy mieć ten kod:

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

Problemem jest wczytuje w mysql domyślnie nie zwracają uwagi do transakcji. Tak więc bardzo traffickowana strona internetowa będzie miała niedokładne wyniki.

Sposób jestem przyzwyczajony do robienia tego typu rzeczy jest po prostu zadzwonić:

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

Chyba moje pytanie, jak to zrobić w hibernacji? A po drugie, jak mogę zrobić taką aktualizację w Hibernate, która jest nieco bardziej złożona?

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; 

Odpowiedz

5

Problem istnieje czyta w mysql domyślnie nie zwracają uwagi do transakcji. Tak więc bardzo traffickowana strona internetowa będzie miała niedokładne wyniki.

Rzeczywiście. użyłbym operację stylu DML tutaj (patrz rozdział 13.4. DML-style operations):

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(); 

co powinno skutkować

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

a po drugie, w jaki sposób mogę zrobić aktualizację takiego w Hibernate, który jest nieco bardziej złożony?

Hmm ... Kusiło mnie, aby powiedzieć "jesteś zmiażdżony" ... musisz się więcej zastanowić.

+0

Dziękuję Pascal. Nie wiedziałem, że mogę robić aktualizacje w HQL. Wygląda łatwo. Ale jeśli chodzi o mój bardziej złożony przykład, czy padłby ofiarą tego samego problemu SELECT, nie zwracając uwagi na transakcje? Jak sugerujesz, że sobie z tym poradzę? –

0

stored procedure oferuje kilka korzyści:

  1. w przypadku, gdy zmiany schematu, kodu nie musi się zmienić, jeśli to było call increment($id)
  2. zagadnienia współbieżności można zlokalizować.
  3. Szybsza realizacja w wielu przypadkach.

Ewentualna realizacja jest:

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