QUANTO A TRANSAÇÕES… sei que é uma discução um tanto quanto antiga, mas achei o assunto legal e gostaria de compartilhar uma solução…
public ActionForward gravar(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
DynaActionForm atividadeForm = (DynaActionForm)form;
Atividade atividade = null;
SystemUserSession systemUserSession = new SystemUserSession(request);
BusinessTransaction businessTransaction = getBusinessTransactionFactory().createNewBusinessTransaction((SystemUser)systemUserSession.getModel());
try {
businessTransaction.start();
AtividadeBusiness atividadeBusiness = new AtividadeBusiness(businessTransaction);
atividade = (Atividade)atividadeBusiness.newEntityInstance(
((Long)atividadeForm.get("idAtividade")).longValue()
);
BeanUtils.copyProperties(atividade, atividadeForm);
try {
businessTransaction.beginTransactionalBlock();
atividadeBusiness.save(atividade);
businessTransaction.commitTransactionalBlock();
} catch (BusinessTransactionException bte) {
businessTransaction.rollbackTransactionalBlock();
setAlertMessage(request, be.getMessage());
}
} finally {
businessTransaction.finish();
}
atividadeForm.initialize(mapping);
return mapping.findForward("_FormAtividade");
}
Nessa solução que implementei na arquitetura que desenvolvi para fabrica de software que trabalho, criei uma classe responsavel por controlar o escopo (start/finish) e as ações (begin/commit/rollback) das trasações de negócio do sistema.
O fluxo é o seguinte…
-
start() - cria uma sessão SessionFactory.
- Vários business-objects podem ser instanciados passando a instância “startada” de businessTransaction e manipulados.
-
beginTransactionalBlock() - inicia uma transação do Hibernate (session.beginTransaction()).
(save/remove/get/anyMethod).
-
businessTransaction.commitTransactionalBlock() ou businessTransaction.rollbackTransactionalBlock() - comita ou descarta a trasação do Hibernate.
-
businessTransaction.finish() - encerra a sessão do Hibernate.
Obviamente que existem outras classes e interfaces envolvidas na parada, mas o conceito é esse.
Da maneira como estruturei essa arquitetura, fica bastante fácil se amanhã ou depois eu não quiser mais utilizar o Hibernate e passar a usar um outro mecanismo de persistencia, porque toda a estrutura está baseada em interfaces.
Bom espero que ajude… espliquei bem por cima, como disse, tem várias classes e interfaces envolvidas, mas acho que deu para enternder o conceito, né?
Sei que ainda tem várias coisas para serem melhoradas e estou trabalhando todos os dias para fazer isso…
…sugestões são bem vindas…
Abraço!