Play2 Wie verwalte ich die Transaktion von der Service-Ebene anstelle der Action-Ebene?

Ich verwende Play2.1.1 Java mit JPA2.0 mit Implementierung im Ruhezustand.

die Transaktion durch Code zu steuern, anstatt @transactional wie unten zu verwenden, ist der normale JPA-Codestil. Gibt es eine Möglichkeit, wie unten bei Play zu arbeiten? oder wie man JPA.withtranaction () benutzt, um zu tun? Ich habe es versucht, keine Ahnung, wie der Parameter übergeben werden soll, ich bin nicht mit Funktionscode vertraut. Danke vielmals. Bitte geben Sie mir einen Beispielcode basierend auf unten.

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

Jetzt ändere ich meinen Code unten, um die Transaktion von der Serviceebene aus zu starten. Sieht nicht effizient aus. Gibt es eine andere Möglichkeit zum Schreiben? Vielen Dank

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage