Seja bem vindo ao Fórum do JavaFree.org
Aqui você irá encontrar respostas para TUDO o que você precisa sobre java.
Deseja participar? Crie sua conta ou efetue seu login
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!!"
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.
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!!"
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.
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!!"
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!!"
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!!"
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.
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!!"
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?
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!!"
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!!"
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)
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!!"
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)
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!!"
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)
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!!"
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)
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)
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!!"
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)
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!!"
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
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!!"
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!!"
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)
É 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!!"
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)
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!!"
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)
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!!"
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.
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
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!!"
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!!"
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!!"
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)
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!!"
paulohbmetal Offline
Posts: 290
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!!"
vfpamp Offline
Posts: 6009
Olá Paulo...
Sabe que para discussões a galera daqui é power...
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.
Já me sinto no dever de criar um objeto controlador desse fluxo.
_________________
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.
paulohbmetal Offline
Posts: 290
É 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!!"
vfpamp Offline
Posts: 6009
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.
paulohbmetal Offline
Posts: 290
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!!"
paulohbmetal Offline
Posts: 290
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!!"
vfpamp Offline
Posts: 6009
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.
paulohbmetal Offline
Posts: 290
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!!"
vfpamp Offline
Posts: 6009
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.
paulohbmetal Offline
Posts: 290
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!!"
vfpamp Offline
Posts: 6009
Depende, pode ser dentro do DAO ou pode ser um objeto separado ao DAO, mas geralmente é o DAO que controla esse obj.
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.
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.
paulohbmetal Offline
Posts: 290
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!!"
vfpamp Offline
Posts: 6009
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.
paulohbmetal Offline
Posts: 290
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!!"
ronaldtm Offline
Posts: 2299
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)
paulohbmetal Offline
Posts: 290
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!!"
ronaldtm Offline
Posts: 2299
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.
É, 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)
paulohbmetal Offline
Posts: 290
Nunca é tarde né?!
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!!"
ronaldtm Offline
Posts: 2299
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
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)
paulohbmetal Offline
Posts: 290
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!!"
ronaldtm Offline
Posts: 2299
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)
ronaldtm Offline
Posts: 2299
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)
paulohbmetal Offline
Posts: 290
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!!"
ronaldtm Offline
Posts: 2299
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)
paulohbmetal Offline
Posts: 290
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!!"
daltoncamargo Offline
Posts: 8768
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
paulohbmetal Offline
Posts: 290
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!!"
paulohbmetal Offline
Posts: 290
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!!"
ronaldtm Offline
Posts: 2299
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)
paulohbmetal Offline
Posts: 290
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!!"
ronaldtm Offline
Posts: 2299
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)
paulohbmetal Offline
Posts: 290
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!!"
ronaldtm Offline
Posts: 2299
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)
paulohbmetal Offline
Posts: 290
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!!"
daltoncamargo Offline
Posts: 8768
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
paulohbmetal Offline
Posts: 290
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!!"
paulohbmetal Offline
Posts: 290
??
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!!"
paulohbmetal Offline
Posts: 290
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!!"
ronaldtm Offline
Posts: 2299
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)
paulohbmetal Offline
Posts: 290
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.
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!!"
Relacionados
Prevayler: servidor de objetos? http://javafree.uol.com.br/topic-11510-Prevayler-servidor-de-objetos.html Sincronizando projetos feitos no Eclipse e no Netbeans simul http://javafree.uol.com.br/topic-850702-Sincronizando-projetos-feitos-no-Eclipse-e-no-Netbeans-simul.html SWT http://javafree.uol.com.br/topic-13760-SWT.html Arquitetura de Aplicação Swing http://javafree.uol.com.br/topic-865243-Arquitetura-de-Aplicacao-Swing.html Organizacao do Projeto no Eclipse http://javafree.uol.com.br/topic-14460-Organizacao-do-Projeto-no-Eclipse.html MVC http://javafree.uol.com.br/topic-853239-MVC.html Arquitetura de Sistema (Desktop) http://javafree.uol.com.br/topic-866562-Arquitetura-de-Sistema-Desktop.html Software Livre, uma boa para o meu caso ? http://javafree.uol.com.br/topic-4291-Software-Livre-uma-boa-para-o-meu-caso.html Facade e DAO http://javafree.uol.com.br/topic-863954-Facade-e-DAO.html