dúvida sobre aspect

2 respostas
cezbatistao

falaaaaaaa ae galera… blz!?

então… tenho uma dúvida sobre aspectos em java…
li o artigo da java magazine nº 34… e achei mto interessante e tal…

e como jah tinha lido o artigo da java magazine nº 33 sobre hibernete… andei pensando… em juntar os 2… por exemplo… nesse trecho de um dao…

public void salvaReserva(Reserva r) {
        try {
            Session ses = TransacaoAplicacao.getSessao();
            ses.saveOrUpdate(r);
            //TODO: Tirar todos os confirmas e deixar que alguém (o controlador?) faça isto???
            TransacaoAplicacao.confirma();
        }
        catch (ConstraintViolationException e) {
            TransacaoAplicacao.aborta();
            DateFormat df = DateFormat.getInstance();
            throw new InsercaoDuplicadaException("Outro usuário já fez uma reserva para a sala " +
                    r.getSala().getNome() + " no dia " + df.format(r.getInicio()), e);
        }
        catch (StaleObjectStateException e) {
            TransacaoAplicacao.aborta();
            throw new LockOtimistaException("A Reserva " + r.getId() + " já foi alterada por outro usuário", e);
        }        
        catch (Exception e) {
            TransacaoAplicacao.aborta();
            throw new PersistenciaException("Não foi possível salvar a Reserva: " + r.getId(), e);
        }        
    }

para inserir no banco dados referente a reserva de uma sala…
naum soh no metodo salvar… mas tb nos outros da classe dao acontece direto chamada aos metodos…

Session ses = TransacaoAplicacao.getSessao();
...
TransacaoAplicacao.confirma();
...
TransacaoAplicacao.aborta();

e pensei em usar aspecto para diminuir isso…
fora q a maioria dos catch tb da para usar aspectos…

mas veio uma dúvida…
tem como no aspecto criar algo como

Session ses = TransacaoAplicacao.getSessao();

e depois na minha classe dao usar a instancia de ses para fazer por exemplo

ses.saveOrUpdate(r);

como eu faria isso!?

[]'s
e valeu ae galera!! =)

2 Respostas

C

Então, o gerenciamento de transações (o seu TransacaoAplicacao) não deve ficar em DAOs, porque você pode usar vários DAOs dentro de uma única transação.

Aspectos caem muito bem para gerenciar a Session e Transaction do Hibernate. Você intercepta os métodos que correspondem a uma transação, e faz o tratamento.

Eu havia feito um artigo(foi perdido na queda do GUJ, mas tenho em casa) em que mostrava como fazer isso com CGLib. Uma implementação com aspectos seria muito parecida meusmo.

Fabricio_Cozer_Marti

Sim, tem, com Aspects você consegue tudo! O poder é alto, assim como o carneiro descreveu, vc pode interceptar utilizando Aspects as classes que tenham transações, e ainda acoplar tratamentos de excecoes também, olha um molde de como ficaria sua classe, vamos supor um Façade da sua aplicação.

public class NegocioFacade extends FacadeAplicacao{
  public void processarNegocio(Object ob1, Object ob2) throws Exception {

        NegocioAB.fazAlgo();
        NegocioCD.fazOutroAlgo();
        NegocioDE.fazAlgoAlem();
        NegocioEF.fazAlgoDepoisAlem();
        NegocioGH.fazFinalizaAlgo();

  }
}

Lindo né ? Olha que só o nível de abstração que temos aqui, o programador que está escrevendo esse código, não precis saber de Transação, de Excecao, de Cache, de Nada, … assim até minha vó vai começar a escrever códigos para sistemas grandes. :stuck_out_tongue:

Criado 13 de abril de 2006
Ultima resposta 13 de abr. de 2006
Respostas 2
Participantes 3