Play2 ¿Cómo administrar la transacción desde la capa de servicio en lugar de la capa de acción?

Estoy usando Play2.1.1 Java con JPA2.0 con implementación de hibernación.

controlar la transacción por código en lugar de usar @transactional como a continuación es el estilo de código JPA normal. ¿Hay alguna manera de trabajar como abajo en Play? o ¿cómo usar JPA.withtranaction () para hacer? Lo intenté, no tengo idea de cómo pasar el parámetro, no estoy familiarizado con el código funcional. muchas gracias. Por favor, dame un código de ejemplo basado en a continuación.

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

Ahora cambio mi código a continuación para iniciar la transacción desde la capa de servicio. No parece eficiente, ¿hay alguna otra forma de escribir? Gracias

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

Respuestas a la pregunta(2)

Su respuesta a la pregunta