Play2 Jak zarządzać transakcją z poziomu warstwy usług zamiast warstwy akcji?

Używam Play2.1.1 Java z JPA2.0 z implementacją hibernacji.

aby kontrolować transakcję za pomocą kodu zamiast używać @transactional jak poniżej, jest normalny styl kodu JPA. Czy jest jakiś sposób na działanie jak poniżej w Play? lub jak korzystać z JPA.withtranaction ()? Próbowałem tego, nie mam pojęcia jak przekazać parametr, nie znam kodu funkcyjnego. wielkie dzięki. Podaj mi przykładowy kod na podstawie poniższego.

public  void createActorB(final String email, final String psw) throws Throwable {
    EntityManager manager = JPA.em();
    try {
        EntityTransaction ex = manager.getTransaction();
        this.dbActor.setEmail(email);
        this.dbActor.setCredential(psw);
        manager.persist(this.dbActor);
        ex.commit();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        throw new ActorException(CODE.UNKNOWN, e);
    } finally {
        manager.close();
    }
}

Teraz zmieniam mój kod poniżej, aby rozpocząć transakcję z warstwy usług. Nie wygląda to wydajnie, czy jest jakiś inny sposób na napisanie? dzięki

private void internalCreateActor(String email, String psw) throws ActorException {
        if (StringUtils.isEmpty(email) || StringUtils.isEmpty(psw))
            throw new ActorException(CODE.INVALIDE_PARAMETER);
        try {
            this.dbActor.setEmail(email);
            this.dbActor.setCredential(psw);
            this.dbActor.setCreateD(new Date());
            JPA.em().persist(this.dbActor);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw new ActorException(CODE.UNKNOWN, e);
        }
    }

 public void createActor(final String email, final String psw, final String cellPhone, final Actor.TYPE type)
            throws Throwable {

        JPA.withTransaction(new Callback0() {
            @Override
            public void invoke() throws Throwable {
                internalCreateActor(email, psw, cellPhone, type);
            }
        });
    }

questionAnswers(2)

yourAnswerToTheQuestion