2013-06-08 15 views
5

Używam JDO do przechowywania danych w projekcie 2.1 Scala Play. Najlepiej byłoby, gdyby każde zlecenie zawierało swoją własną transakcję, zobowiązując się do jej zakończenia i wycofując, jeśli coś pójdzie nie tak.Jaki jest tradycyjny sposób obsługi transakcji w Play 2 Scala?

Najlepszym sposobem, w jaki mogę to zrobić, jest Kompozycja akcji, w której mogę utworzyć własny obiekt podobny do Action, który rozpoczyna transakcję, opakowuje blok kodu w Action, ocenia go i zapisuje wynik, zatwierdza lub wycofuje transakcję, a następnie zwraca wynik.

Jedyne, co mnie niepokoi, to to, że mój cały projekt składa się obecnie z DbAction s zamiast standardowych Action s. Nie jestem pewien, dlaczego tak mnie to obchodzi, z wyjątkiem tego, że uważam, że musi być lepsze miejsce na to. Jednak gdy sprawdzę haki dostępne w GlobalSettings, nic nie wygląda tak, jakby działało.

Czy powinienem po prostu zadzwonić pod numer DbAction i przestać się zastanawiać, czy istnieje miejsce, w którym można to zachowanie zawiesić, abym mógł po prostu użyć Action?

Todd

Odpowiedz

0

nie jestem pewien, że nie jest najlepszym rozwiązaniem dla tego jeszcze. Nie mogę się doczekać, aby przeczytać odpowiedzi innych ludzi.

This page powinien pokazać, jak zrobić to, co chcesz zrobić. Zasadniczo w Global możesz rozszerzyć WithFilters lub zastąpić doFilter. Wciąż po prostu pakujesz Akcja, ale robisz to z centralnego miejsca.

Teraz, bez względu na to, czy jest to lepszy pomysł, niż czynienie kompilacji akcji zgodnie z sugestią here, nie wiem.

+0

Chciałabym sprawdzić oba te odpowiedzi, ponieważ oba wydają się jak sposób na radzenie sobie z problem. Chciałbym, aby inne osoby, które miały więcej doświadczenia, przedstawiały swoje opinie. Sądzę, że zaletą Action Composition jest to, że mogę kontynuować dostarczanie pewnych standardowych bitów danych, do których wielu kontrolerów będzie potrzebować dostępu. Zaletą korzystania z filtra (którego wcześniej nie widziałem) jest to, że wszystko dzieje się za kulisami, a Ty zajmujesz się czymkolwiek jawnie. – TOB

2

Nie, jeśli jest to lepsza alternatywa, ale można również użyć Action Composition zamiast tworzenia podklasy przez dziedziczenie.

W zasadzie można napisać coś takiego:

def TransactionalAction(f: Request[AnyContent] => Result): Action[AnyContent] = { 
    Action { request => 
    startTransaction 
    try { 
     f(request) 
     commit 
    } catch { 
     case e: Exception => rollback 
    } 

    } 
} 

a następnie użyć:

def index = TransactionalAction { request => 
    val something = someQueriesInDB 
    Ok(something) 
} 
+0

Duh! Miałem na myśli Kompozycję Akcji, a nie rozszerzenie. Po prostu * czuję się * tak, jakbym rozszerzył 'Action', ale tak naprawdę po prostu go zawijam. Zmienię moje pytanie, aby było jasne. – TOB

+0

Ah ok, przepraszam :-) –

+1

Nie, przepraszam, zmarnowałem twój czas pisząc tę ​​genialną odpowiedź (co mogę powiedzieć, ponieważ to właśnie miałem na myśli). :-) – TOB

Powiązane problemy