Я использую Play2.1.1 Java с JPA2.0 с реализацией спящего режима.Play2 Как управлять транзакцией из уровня сервиса вместо слоя действия?
для управления транзакцией по коду вместо использования @transactional, как показано ниже, является нормальным стилем JPA-кода, есть ли способ работать, как показано ниже в Play? или как использовать JPA.withtranaction()? Я попробовал, не знаю, как передать параметр, я не знаком с функциональным кодом. большое спасибо. Пожалуйста, дайте мне пример кода, основанный ниже.
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();
}
}
Теперь я меняю свой код ниже, чтобы начать транзакцию с уровня сервиса, он выглядит неэффективно, есть ли другой способ писать? благодаря
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);
}
});
}
Благодаря @biesior я обновил версию и записи текущего ходить вокруг, есть ли другое решение? Благодарю. – LWang