Forum Main Page > Ferramentas, APIs e Frameworks

Arquitetura de sistema Swing...

Goto page 1 , 2  Next - >>

New Topic    Reply Message


  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Salve Brothers of Java!!

    Gostaria de de discutir a forma em que estou construindo meu sistema Swing em camadas.

    Bom, a tempos atrás estava eu procurando uma forma de fazer o mapeamento objeto-relacional
    até que me deparei com este artigo e gostei da forma de mapeamento.

    Bom, mas a partir desta forma de mapeamento, eu comecei a bolar uma forma de para melhor me adaptar.
    Vou colocar um exemplo, para que fique mais clara a forma em que estou desenvolvendo:

    Por exemplo no cadastro de usuários.Tenho minha classe(bean) Usuario:



    uma interface para o DAO:



    o DAO:



    Minha classe de negócio,



    E minha Factory:



    Bom daí o que faço:

    No meu view(JFrame, JInternalFrame e etc...), instancio um objeto do tipo CadastroDeUsuarios(que aplico as regras de negócio), que por sua vez obtém através do Factory o DAO que faz as operações no banco.Por enquanto não estou trabalhando com ele distribuído, mas caso venha, crio uma interface para a classe de cadastro(Business).

    Bom, as vezes acho que estou escrevendo demais, mas me parece que é assim mesmo.Gostaria que dessem suas opniões para discutirmos se
    está bom e se não, qual é a melhor forma.

    O que acham?! :arrow:

    Bom, espero ter sido claro, e espero críticas também.

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. vfpamp
    Offline
    Posts: 6009

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Olá Paulo...

    Sabe que para discussões a galera daqui é power... hehehe.

    Vamos lá. A meu ver você está indo muito bem separou em camadas e está usando design patterns.

    Quando você usa esses dois você tende a escrever mais código, para deixar a aplicação mais bonitinha. Cada um com seu papel e tals. Isso é bom, deixa a aplicação simples, Toda a telaX telá uma classeX que instanciará um DAOX que utilizará o BeanX para salvar na tabela X.

    Agora, eu gosto de usar e abusar da OO, portanto classe e herança a dar com os pés. . O simples fato de ter essa regra:

    mim:
    Toda a telaX telá uma classeX que instanciará um DAOX que utilizará o BeanX para salvar na tabela X.


    Já me sinto no dever de criar um objeto controlador desse fluxo. Assim eu evito que algum outro desenvolvedor ao criar a telaX chame a regraY e não a regraX.


    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    http://twitter.com/vitorpamplona

    Não respondo dúvidas por e-mail, nem msn, nem via private message. Use o fórum para isso.




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Quote:
    Assim eu evito que algum outro desenvolvedor ao criar a telaX chame a regraY e não a regraX.



    É verdade.E fica bem mais organizado né?

    É que as vezes dá até uma confusão, pois pode-se escrever muito...

    Bom, aproveitando a deixa, gostaria de tirar outra dúvida.
    Essa diz respeito a relacionamento entre objetos(Composição e etc...).

    Bom, em minha aplicação (para estúdios de música) existem quatro tabelas:

    Banda,BandaIntegrantes e Integrantes.

    E elas se relacionam de tal forma que uma banda pode ter vários integrantes e um integrante por ter/estar em várias bandas.
    Mas como o integrante pode ter várias bandas, não quer dizer que ele toca o mesmo instrumento em todas as bandas.Então criei um campo de código na tabela-relacionamento BandaIntegrantes relativo a função do integrante na banda.

    Só que para mapear isso em objetos eu criei de uma forma que ainda não sei se é a mais adequada.

    Fiz o seguinte:

    - Criei a classe Banda /* Correspondente a banda*/
    - Criei a classe BandaIntegrante /* Correspondente a relação banda-integrante */
    - Criei a classe Integrante /* Correspondente ao Integrante */
    - Criei a classe Funcao /* Correspondente á função do integrante na banda(baterista, baixista e etc)*/

    A classe BandaIntegrante possue como atributos uma classe Banda, uma classe Integrante e uma classe Funcao, servindo assim para o cadastro de Integrantes e para o cadastro de Bandas.

    As classes Banda e Integrante possuem como atributo uma collection(LinkedList) de BandaIntegrante.Daí posso ter vários itens e fazer o relacionamento de uma com a outra.
    Quando vou cadastrar a banda, por exemplo, eu passo o mesmo objeto banda para cada item da minha colection de BandaIntegrante, somente mudando o objeto integrante.Com isso posso controlar melhor a questão da função por integrante-banda e controlo o relcionamento.

    Agora pergunto, o que acham também?

    Bom espero que tenha fica claro.

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. vfpamp
    Offline
    Posts: 6009

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    hum... eu faria algo assim (Mudei alguns nomes das suas classes):







    Assim, você tem um cadastro de Pessoas, um de Funções e outro de Bandas. Utilizando o addIntegrante, você adiciona uma pessoa na banda, ou seja, a banda é composta por integrantes.

    É claro, isso na modelagem OO.
    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    http://twitter.com/vitorpamplona

    Não respondo dúvidas por e-mail, nem msn, nem via private message. Use o fórum para isso.




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Na realidade minha classe Integrante herda de pessoa, só que não postei para simplificar...

    Mas desta maneira eu estaria vinculando o Cadastro de integrantes ao de bandas, não?!

    Pergunto isso pois tenho um outro view cadastro de integrantes, e lá pode ser definido as bandas e as função do integrante em cada banda, entende?

    Daí para cada "tabela" (Integrante, Banda, BandaIntegrantes) tenho toda aquela estrutura objeto-relacional que descrevi na primeira mensagem.

    A Paz!!
    Paulo Henrique
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Olha aí, "procurei encrenca" lá no GUJ também: hehehehe



    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. vfpamp
    Offline
    Posts: 6009

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    paulohbmetal:
    Olha aí, "procurei encrenca" lá no GUJ também: hehehehe



    A Paz!!




    hehehhehe só não da encrenca porque a tua aquitetura está boa. .

    Mas, é claro, tudo que é bom pode ser melhorado.
    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    http://twitter.com/vitorpamplona

    Não respondo dúvidas por e-mail, nem msn, nem via private message. Use o fórum para isso.




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Novamente aproveitando a deixa, como vcs fazem o controle de transação?

    Pois pode ser que precise ou não, não é?

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. vfpamp
    Offline
    Posts: 6009

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    hum... controle de transação?

    Depende.. se você pode trabalhar com frameworks de IoC, use o Spring e deixe que ele cuide da Transação, caso contrário vais ter que ter um objeto Transaction armazenando o estado da transação e efetuando os locks das tabelas desejadas.
    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    http://twitter.com/vitorpamplona

    Não respondo dúvidas por e-mail, nem msn, nem via private message. Use o fórum para isso.




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    vfpamp:
    hum... controle de transação?

    Depende.. se você pode trabalhar com frameworks de IoC, use o Spring e deixe que ele cuide da Transação, caso contrário vais ter que ter um objeto Transaction armazenando o estado da transação e efetuando os locks das tabelas desejadas.



    Mas onde eu teria acesso a esse objeto Transaction?

    Pergunto pois, existem partes em minha aplicação em que faço acesso a a objeto de regra de negócio de outra tabela, por exemplo, o citado acima.No cadastro de bandas já posso cadastrar os integrantes.

    Qual é o correto, relacionar Objetos de regra de negócio de um com o outro, relacionar DAO's ou relacionar DAO de um com regras de negócio de outro?

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. vfpamp
    Offline
    Posts: 6009

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    paulohbmetal:

    Mas onde eu teria acesso a esse objeto Transaction?



    Depende, pode ser dentro do DAO ou pode ser um objeto separado ao DAO, mas geralmente é o DAO que controla esse obj.

    paulohbmetal:

    Pergunto pois, existem partes em minha aplicação em que faço acesso a a objeto de regra de negócio de outra tabela, por exemplo, o citado acima.No cadastro de bandas já posso cadastrar os integrantes.



    Um DAO usa o outro dentro da mesma transaction. Um método de DAO nem sempre tem os comandos de abrir transação e fechar transação.

    paulohbmetal:

    Qual é o correto, relacionar Objetos de regra de negócio de um com o outro, relacionar DAO's ou relacionar DAO de um com regras de negócio de outro?



    Hum... isso ficou confuso...
    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    http://twitter.com/vitorpamplona

    Não respondo dúvidas por e-mail, nem msn, nem via private message. Use o fórum para isso.




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    vfpamp:
    Hum... isso ficou confuso...



    hehehehehehe...Tipo assim, eu tenho uma instância do CadastroDeIntegrantes dentro de BandaDAO, daí eu reutilizo os métodos e validações que já criei em CadastroDeIntegrantes para cadastrar Integrantes que possam vir a ser cadastrados pelo cadastro de bandas.

    Ou seja: Objeto de Regra de negócio de Integrantes dentro do DAO da banda.Entendeu?!

    Mas aí que entra o problema, como controlar uma transação que envolve 2 dao's e duas regras de negócio?

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. vfpamp
    Offline
    Posts: 6009

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    O objeto de regra de negócio de banda deveria fazer uso do de integrantes e deixar os DAOs fazerem o serviço deles.
    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    http://twitter.com/vitorpamplona

    Não respondo dúvidas por e-mail, nem msn, nem via private message. Use o fórum para isso.




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    vfpamp:
    O objeto de regra de negócio de banda deveria fazer uso do de integrantes e deixar os DAOs fazerem o serviço deles.



    Blz, mas ainda continuo com o problema da transação, pois na Regra de Negócios do Integrante eu posso estar trabalhando com uma transação e na da banda outra.
    Aí tem a saída de usar um objeto Transaction, como vc disse, mas como ele enxergaria as Regras de Negócio ou os DAO's sem se prender a elas?!

    Pois se eu mudar o modo de persistência, para arquivo por exemplo, o modelo de transações pode poderia não ser o ideal.

    Espero não estar sendo chato.

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. ronaldtm
    Offline
    Posts: 2299

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    paulohbmetal:
    Blz, mas ainda continuo com o problema da transação, pois na Regra de Negócios do Integrante eu posso estar trabalhando com uma transação e na da banda outra.
    Aí tem a saída de usar um objeto Transaction, como vc disse, mas como ele enxergaria as Regras de Negócio ou os DAO's sem se prender a elas?!

    Pois se eu mudar o modo de persistência, para arquivo por exemplo, o modelo de transações pode poderia não ser o ideal.



    Se você usar um framework tipo o Spring ou XWork, você pode usar interceptors (AOP) pra delimitar transações, tirando-as das classes de negócio.

    E DAOs servem pra abstrair a persistência, não devem chamar objetos de negócio, e na minha opinião, nem outros DAOs.
    _________________
    In fact, people who study design methods without also practicing design are almost always frustrated designers who have no sap in them, who have lost, or never had, the urge to shape things. Such a person will never be able to say anything sensible about "how" to shape things either. (Christopher Alexander)




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    ronaldtm:

    Se você usar um framework tipo o Spring ou XWork, você pode usar interceptors (AOP) pra delimitar transações, tirando-as das classes de negócio.



    Vc já usou o Spring para tal(Swing + DAO)?Poderia dar umas dicas então uái...

    É...Dá-lhe framework's!!

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. ronaldtm
    Offline
    Posts: 2299

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    paulohbmetal:
    Vc já usou o Spring para tal(Swing + DAO)?Poderia dar umas dicas então uái...


    Na verdade eu nunca tinha configurado transações no spring não, mas foi uma boa oportunidade pra tentar

    Baixa o projeto (eclipse) aqui: http://www.javafree.com.br/dependencias/ronald/swring.zip
    (Swring = Swing + Spring )

    Na verdade, a parte swing tá meio tosca (tudo numa classe), porque eu não queria complicar mais o exemplo. Pra definir a interface, você pode usar algum framework tipo o SwiXML ou thinlet.

    paulohbmetal:
    É...Dá-lhe framework's!!


    É, se você não quer reinventar um monte de coisas, tem que usar o que já tá pronto, né

    Tetsuo
    _________________
    In fact, people who study design methods without also practicing design are almost always frustrated designers who have no sap in them, who have lost, or never had, the urge to shape things. Such a person will never be able to say anything sensible about "how" to shape things either. (Christopher Alexander)




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    ronaldtm:

    paulohbmetal:
    Vc já usou o Spring para tal(Swing + DAO)?Poderia dar umas dicas então uái...


    Na verdade eu nunca tinha configurado transações no spring não, mas foi uma boa oportunidade pra tentar



    Nunca é tarde né?!

    ronaldtm:

    Na verdade, a parte swing tá meio tosca (tudo numa classe), porque eu não queria complicar mais o exemplo. Pra definir a interface, você pode usar algum framework tipo o SwiXML ou thinlet.



    Não pode deixar, o projeto já está bem avançado e estou usando o NetBeans.

    Bom, vou olhar seu código, e na dúvida, posto aqui, valeu?!

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. ronaldtm
    Offline
    Posts: 2299

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Ah sim, esqueci de falar... na configuração do bean eu usei o ProxyFactoryBean, mas daí precisa fazer isso pra cada classe de serviço, pra delimitar as transações. Na documentação do spring fala que tem um outro jeito, usando 'autoproxy', podendo fazer a configuração uma vez só pra todos os beans, mas eu não consegui fazer isso funcionar.

    Pra testar o esquema das transações, eu forcei uma exceção (RuntimeException) no método remove do ItemService, depois dele ter chamado o DAO, e ele fez o rollback corretamente. Eu retirei isso do código pra você não ter nenhuma surpresa mas você pode tentar fazer isso pra testar.

    Tetsuo
    _________________
    In fact, people who study design methods without also practicing design are almost always frustrated designers who have no sap in them, who have lost, or never had, the urge to shape things. Such a person will never be able to say anything sensible about "how" to shape things either. (Christopher Alexander)




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    ronaldtm:
    Ah sim, esqueci de falar... na configuração do bean eu usei o ProxyFactoryBean, mas daí precisa fazer isso pra cada classe de serviço, pra delimitar as transações. Na documentação do spring fala que tem um outro jeito, usando 'autoproxy', podendo fazer a configuração uma vez só pra todos os beans, mas eu não consegui fazer isso funcionar.

    Pra testar o esquema das transações, eu forcei uma exceção (RuntimeException) no método remove do ItemService, depois dele ter chamado o DAO, e ele fez o rollback corretamente. Eu retirei isso do código pra você não ter nenhuma surpresa mas você pode tentar fazer isso pra testar.

    Tetsuo



    hehehehe..Valeu, tá avisado.

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. ronaldtm
    Offline
    Posts: 2299

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    paulohbmetal:
    hehehehe..Valeu, tá avisado.


    Ahhhhh mais um aviso!
    Se você estiver usando MySQL, crie as tabelas como InnoDB, pois as MyISAM (default) não suportam transações (não dão rollback)!

    Tetsuo
    _________________
    In fact, people who study design methods without also practicing design are almost always frustrated designers who have no sap in them, who have lost, or never had, the urge to shape things. Such a person will never be able to say anything sensible about "how" to shape things either. (Christopher Alexander)




  1. ronaldtm
    Offline
    Posts: 2299

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Aeeeeee!!!!
    Descobri como configurar o autoproxy!
    O problema é que eu estava usando o XmlBeanFactory, quando eu deveria estar usando um ApplicationContext (ClassPathXmlApplicationContext, no caso).

    São só essas duas alterações:

    Context.java


    spring-context.xml


    Assim não é mais necessário configurar um ProxyFactoryBean pra cada serviço, basta declará-los normalmente (como o itemService), pois o autoProxyCreator está configurado para adicionar proxies a todos os beans cujos nomes terminam em 'Service' (*Service)

    Tetsuo
    _________________
    In fact, people who study design methods without also practicing design are almost always frustrated designers who have no sap in them, who have lost, or never had, the urge to shape things. Such a person will never be able to say anything sensible about "how" to shape things either. (Christopher Alexander)




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Fala ronald, voltei a mexer...

    Tipo assim, vc configurou o autoProxyCreator para controlar transações nas classes de serviços que terminarem com Service(*Service).



    Bom, mas se eu quiser especificar o método que deverá controlar a transação?

    Pois, por exemplo, eu posso ter um facade que tem médodos de persistência, mas também existirão métodos de consulta que não exisgem controle de transação. E aí?

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. ronaldtm
    Offline
    Posts: 2299

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    dá pra fazer isso com advisors. consegui fazer funcionar aqui, abaixo vai o código:











    Rodando isso aí, é impresso:


    o que significa que apenas o método b() foi interceptado, como especificado no patternAdvisor. usando regex.

    Tetsuo
    _________________
    In fact, people who study design methods without also practicing design are almost always frustrated designers who have no sap in them, who have lost, or never had, the urge to shape things. Such a person will never be able to say anything sensible about "how" to shape things either. (Christopher Alexander)




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    O fórum ainda não tá 100% não né? Eu não recebi notificação de resposta.

    1 - Bom, agora eu estou com outr problem, tipo assim estou querendo usar minha estrutura que já está pronta(DAO) com o spring. Mas pelo que vi, para que eu possa usar o spring com meus DAO's tenho que usar a estrutura DAO feita no spring, por exemplo minhas classes de implementação DAO herdando de JdbcDaoSupport(spring).

    Mas eu queria deixar o Spring o menos "intrusivo" possível. Tipo assim, eu teria minha configuração de dataSouce no xml, com controle de transações e na minha classe de DB eu pegaria a conexão do Spring através do dataSource configurado no mesmo.

    E aí, tem como?

    2 - Meu dataSouce fica numa classe que implementa uma interface DataBase que criei. Daí meus DAO's executam o SQL nesta classe DataBase.

    Eu criei uma classe de contexo(como no seu exemplo) e a partir desta classe eu obtenho o dataSouce que está configurado no xml do Spring. Bom até aí é lindo... Na minha classe de DataBase eu obtenho a instancia de DataSource e daí obtenho minha conexao. Mas o problema é que a conexao está autoCommit(true) automática.

    Segue abaixo parte do xml:


    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. daltoncamargo
    Offline
    Posts: 8768

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    paulohbmetal:
    O fórum ainda não tá 100% não né? Eu não recebi notificação de resposta.



    Quando você criou este tópico, você não habilitou a opção de receber notificação. Edite o mesmo e marque a opção ( Quero receber um email quando alguém responder).

    Later!
    _________________
    Dalton Camargo

    Sugestão de Livro do JavaFree para os iniciantes em Java

    0




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    daltoncamargo:

    paulohbmetal:
    O fórum ainda não tá 100% não né? Eu não recebi notificação de resposta.



    Quando você criou este tópico, você não habilitou a opção de receber notificação. Edite o mesmo e marque a opção ( Quero receber um email quando alguém responder).

    Later!



    Ah tá... E que quando criei o tópico não era preciso fazer isso.

    Valeu!!

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    E aí galera, ninguém? Ou não entenderam?

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. ronaldtm
    Offline
    Posts: 2299

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Se você usar diretamente um DataSource injetado pelo Spring, os interceptors não tem a chance de iniciar a transação, e a sua conexão não pode ser gerenciada.

    Para usar as facilidades do Spring sem ter que alterar muito o seu código, basta que, quando você for pegar a conexão, usar o método DataSourceUtils.getConnection(), que retorna a conexão criada pelos interceptors, no início da transação. Assim, você já vai pegar a conexão gerenciada, e não criar/alocar outra.

    Tetsuo
    _________________
    In fact, people who study design methods without also practicing design are almost always frustrated designers who have no sap in them, who have lost, or never had, the urge to shape things. Such a person will never be able to say anything sensible about "how" to shape things either. (Christopher Alexander)




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Então eu faria isso:

    minhaConexao = DataSourceUtils.getConnection(dataSource);

    É pq eu fiz isso e ainda continua sem propagar a transação no meu Facade.

    Seria alguma coisa no XML de configuração?

    A Paz!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. ronaldtm
    Offline
    Posts: 2299

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Eu não sei, teria que ver o código todo pra saber onde está o problema.
    _________________
    In fact, people who study design methods without also practicing design are almost always frustrated designers who have no sap in them, who have lost, or never had, the urge to shape things. Such a person will never be able to say anything sensible about "how" to shape things either. (Christopher Alexander)




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Bom, meu código está lá em casa. Amanhã eu posto aqui. Mas o que estou fazendo é basicamente o que tem no seu exemplo. Tenho um contexto, e deste contexto eu obtenho minha conexão na minha classe de conexão. Daí eu coloquei essas configurações aí do XML, para que o spring possa interceptar transações nos métodos dos meus Facades...

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. ronaldtm
    Offline
    Posts: 2299

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    hum... você está usando MySQL?
    _________________
    In fact, people who study design methods without also practicing design are almost always frustrated designers who have no sap in them, who have lost, or never had, the urge to shape things. Such a person will never be able to say anything sensible about "how" to shape things either. (Christopher Alexander)




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Não, FireBird.

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. daltoncamargo
    Offline
    Posts: 8768

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Acredito que o seu ponto principal é arquiteturar uma classe que gerencia as transações do seu código correto? Pois então eu vou deixar de lado a parte de declarações, visto que o Ronald já falou tudo sobre ;)
    Uma abordagem legal para acrescentar transações declarativas ao seu método é adicionar programaticamente alguns limites de transações usando a classe TransactionTemplate, assim como em outras classes (como a JdbcTemplate), a TransactionTemplate utiliza um mecanismo de callback.

    Deixa eu usar um exemplo retirado do livro "Spring in Action":





    Você começa implementando a interface TransactionCallback. Pelo fato da mesma ter apenas um método para ser implementado, é muito mais fácil implementá-la como uma classe interna anônima, como mostrado no código acima :) . Coloque o código que você quer dentro de um contexto transacional no método doInTransaction().
    Chamando o método execute() na instância de TransactionTemplate, ele executará o código contido dentro da instância TransactionCallback. Se seu código encontrar um problema, chamando setRollbackOnly() no objeto TransactionStatus fará com que toda a operação seja desfeita. Caso contrário, se o método doInTransaction() retornar sucesso, a transação estará comitada.
    A instância de TransactionTemplate deve ser injetada dentro de CourseServiceImpl, como segue:





    Veja que o bean transactionTemplate possuí uma propriedade transactionManager. Por baixo dos panos, o TransactionTemplate usa uma implementação de PlatformTransactionManager para controlar os detalhes específicos do gerenciamento de transação. O que eu fiz é basicamente associar em uma referência um bean denominado transactionManager, que poderia ser qualquer uma das implementações da interface PlatformTransactionManager.
    As transações programáticas são boas quando você quiser um controle completo sobre os limites da transações. Mas, em contra-partida, elas são um pouco intrusivas. Você teve que alterar a implementação de enrollStudentInCourse(), usando classes específicas do Spring para empregar o suporte para transações programáticas do Spring.

    See ya!

    _________________
    Dalton Camargo

    Sugestão de Livro do JavaFree para os iniciantes em Java

    0




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    hum.... :arrow:

    Daí eu teria que controlar a transação prgramáticamente pelo Spring... Bom, vamos tentar a não programática, se não funcionar, faço assim como vc explicou.

    Como disse que iria postar o código, lá vai...

    Minha facade é simples, pois fiz somente para teste mesmo. Segue:



    Em minha GUI, eu comunico com um Delegate que por sua vez passa a requisição para o Facade acima.

    Meu Facade instancia uma classe do tipo CadastroDePessoas chamada cadastroDePessoas, onde estarão minhas regras de negócio.

    O código da CadastroDePessoas é:



    Que por sua vez, obtem uma instancia de meu DAO através de um Factory. Meu DAO implementa a interface PessoaDAO e a implementação para o FireBird é essa:



    Que por sua vez obtem a instancia de DataBase.Neste caso eu não precisaria nem do Factory de dataBases pois já sei que a implementação que quero é a do FireBird.
    A implementação do FireBird é a seguinte:


    Que por sua vez obtem o dataSource de uma classe de contexto idêntica a do exêmplo do ronald, e o XML de configuração é o que postei anteriormente.

    E aí, onde está o erro? Se é que tem acerto...

    :00ps:

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    ??

    Alguém?

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Ronald,
    Tava olhando o xml aqui e surgiu outra dúvida. No caso do seu aplication-context-etc.xml, vc declara seu DAO específico, no caso o DAO para HSQLDB, como segue



    E se eu tiver um factory de DAO's, como funcionaria? Ou seja, eu não sei qual deve ser o DAO a ser instanciado.

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. ronaldtm
    Offline
    Posts: 2299

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Com o Spring, ele assume o papel da fábrica de objetos, instanciando e configurando os objetos. Mas ele permite também 'instanciar' um objeto via método estático.

    Como é essa sua fábrica? Porque você não sabe o DAO que será instanciado, a fábrica não é sua?
    _________________
    In fact, people who study design methods without also practicing design are almost always frustrated designers who have no sap in them, who have lost, or never had, the urge to shape things. Such a person will never be able to say anything sensible about "how" to shape things either. (Christopher Alexander)




  1. paulohbmetal
    Offline
    Posts: 290

    Comment Arrow

    Publicado em: 10/04/2009 00:18:44

    Eu uso o DAOFactory, como o exibido no site da Sun.

    Daí tenho o minha Factory com o getXYZDAO e getABCDAO. Também tenho o AbstractDAOFactory para saber qual a fábrica de DAO's irei trabalhar, ou Oracle ou FireBird ou etc...

    Outra coisa que está dando um nó na minha cabeça. Quando se está usando um pool de conexões, como vc's sabem qual é a conexão que tenho que dar commit. Ou sei lá, transaction. Tipo assim, chega uma requisição em meu facade, dái tenho que controlar minha transação unicamente para aquela requisição. Esta requisição obtem uma conexão no Pool, e faz o que deve ser feito. Onde vc's relacionam a conexão com a requisição para saber em qual conexão vc's irão dar commit/rollback.
    Ouvi muito se falando em thread local e acho que não entendi direito... Este conceito se aplica ao Swing?

    Espero não estar enchendo...

    Value cara!!

    A Paz!!
    _________________
    Paulo Henrique Borges de Melo
    JavaMetal - GoJava - GUJ - Ubuntu Linux - Rising Cross
    Sun Certified Java Programmer
    Bacharel em Ciência da Computação
    Especialista em Análise e Projetos de Sistemas de Informação
    _____________________________
    "Que a cruz sagrada seja minha luz!!"




  1. Relacionados





New Topic    Reply Message     Forum Main Page -> Ferramentas, APIs e Frameworks


Goto page 1 , 2  Next - >>