2011-11-17 15 views
5

Zwykle graj! commits the transaction after a request completes successfully. Jaki jest prawidłowy sposób ręcznego zatwierdzenia transakcji w Grze?Jak mogę zatwierdzić grę! Transakcja JPA ręcznie?

void addPerson() { 
    Person p = new Person("John", "Doe"); 
    p.save(); 

    // TODO - commit the transaction 

    // Now p should have an ID 
    assert p.id != null; 
    usePersonIdForSomethingNasty(p.id); 
} 
+0

Debuggin, Stwierdziłem, że p ma identyfikator jeszcze przed zatwierdzeniem transakcji. Zastanawiam się jak. – ripper234

+0

http://stackoverflow.com/questions/8169640/how-does-an-entity-get-an-id-before-a-ransaction-is-committed-in-jpa-play – ripper234

Odpowiedz

5

Można uzyskać menedżera EntityManager Hibernacji, wywołując funkcję JPA.em(). Następnie stamtąd masz dostęp do transakcji (JPA.em(). GetTransaction()).

Jeśli zamierzasz sam zarządzać transakcją, będziesz chciał wyłączyć obsługę transakcji Play! (Istnieje adnotacja @NoTransaction, której możesz użyć w tej metodzie lub kontrolerze). W przeciwnym razie Graj! spróbuje dokonać transakcji na końcu żądania, a jeśli już to zrobiłeś, spowoduje to wyjątek.

+0

Sam to znalazłem ... ale wywoływanie 'commit()' wydaje się nie powodować żadnych konfliktów z obsługą transakcji Play. Obiekt jest dodany do bazy danych i nie pojawia się strona błędu. – ripper234

+0

Wywołanie 'commit()' nie powoduje konfliktów samo w sobie, ale jeśli spróbujesz jakichkolwiek dalszych interakcji z DB, musisz uruchomić dla siebie kolejną Transakcję: 'JPAPlugin.startTx (boolean readonly)' From tam również Play może nie wiedzieć, że transakcja już się odbyła. – Indigenuity

0

Nie musisz nic robić. Po zakończeniu żądania bez żadnego wyjątku transakcja zostanie dla ciebie zatwierdzona.

Wystarczy upewnić się, że wywołasz "zapisz" na wszystkich jednostkach, które chcesz utrwalić na końcu transakcji.

+1

Chcę ręcznie zatwierdzić żądanie ... Przeformułowałem to pytanie, aby lepiej odzwierciedlić moje zamiary. – ripper234