我使用Play2.1.1 Java和JPA2.0與hibernate實現。Play2如何從服務層而不是操作層管理事務?
來控制代碼的交易,而不是使用@Transactional像下面是正常的JPA代碼風格的,有什麼辦法像下面的工作在玩嗎?或者如何使用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