| Autor |
Mensagem |
|
|
Ótima novidade, já coloquei no favoritos!
Obrigado.
|
 |
|
|
Boa tarde amigo!
Se eu consegui entender bem, você quer uma rotina para gerar o número máximo de um campo ID, se for isso, você poderá adotar uma das duas abordagem abaixo:
1º) Se você estiver utilizando algum DAO genérico, poderá criar algo parecido com isso:
Ou seja, você chamará o DAO da classe que deseja obter o maxID e passa pelo parâmetro o nome do atributo, isto se os nomes dos atributos forem distintos, caso contrário você poderá utilizar desta forma:
2º) Você poderá criar no DAO de cada classe, o seguinte código:
Ou seja, para cada DAO das classes, você terá a implementação maxID(...,...) passando pelo 1º parâmetro o nome do atributo ID e no 2º parâmetro o nome da classe.
Eu NÃO UTILIZO esta abordagem e não indico utilizá-la, foi apenas uma demonstração de possibilidades.
Espero ter ajudado de alguma forma.
Boa sorte.
|
 |
|
|
jamirdeajr wrote:Se não entendi errado, você gostaria de utilizar do mesmo jeito que fazia antes, só que com JPA ?
Eu faço assim:
E lá no persistence.xml deixei assim:
Perfeito Jamir!
Esta era a formula mágica que não esta conseguindo encontrar na NET.
Muito obrigado, seu código irá me ajudar muito.
Que nosso Senhor e Salvador Jesus lhe abençoe.
-----[ Editado ]-----
Jamir, só faltou informar qual o persistence-unit, conforme o código abaixo:
Obrigado.
|
 |
|
|
Olá.
Eu tenho uma aplicação em funcionamento e nela tenho uma classe chamada GerarDDLs o qual faz uma chamada desta forma:
Este tipo de abordagem me é necessário para gerar somente os DDL´s sem aplicá-los definitivamente no banco, isso me ajuda a verificar o SQL gerado para identificar algum relacionamento ou mapeamento incorreto.
Eu gostaria de fazer o mesmo utilizando JPA, ou seja, só posso utilizar o mapeamento:
e consecutivamente o Hibernate irá efetivar no banco, ou tem como apenas informar para que seja gerado o DDL (sql puro) sem aplicá-lo ?
Obrigado.
|
 |
|
|
Lucas Cavalcanti wrote:acabei de testar aqui assim:
- declaração do packages no web.xml
- interceptor extendendo:
- sem as outras classes...
no meu teste aqui ele passou pelo método accepts. O erro aí deve ser outro...
voltando ao seu código:
vc carrega o usuário, adiciona ele no result e faz o redirect... ou seja: é outra requisição e outra session, por isso o lazy init...
tenta trocar no dao.selectByID o manager.getReference por manager.find, isso deve funcionar
desculpe a confusão =S
Então Lucas.
Como não tive muito sucesso com a anotação @Component sobre a classe ModifiedJPATransaction, eu resolvi seguir o exemplo Interceptando recursos anotados, escrito pelo amigo Tomaz.
Muito obrigado por todas as dicas e paciência.
Valeu mesmo meu irmãozinho...
|
 |
|
|
Lucas Cavalcanti wrote:hum... tenta fazer o seguinte então:
- tire a configuração de packages da jpa
- troque a anotação do interceptor de @Component para @Intercepts
-crie as classes:
assim deve funcionar
[]'s
Oi Lucas, segui as dicas e agora tenho outros erros, onde:
1º) Removendo a declaração br.com.caelum.vraptor.packages do web.xml:
2º) Se eu manter a declaração br.com.caelum.vraptor.packages no web.xml a aplicação compila, porém não executa:
Com a mudança de @Componente para @Intercepts na classe ModifiedJPATransaction, o método accepts(ResourceMethod method) é chamado, porém com a mensagem de erro acima.
3º) Se eu não implementar as duas classes (MyEntityManagerFactoryCreator e MyEntityManagerCreator) e manter a declaração no web.xml e também trocar de @Component para @Intercepts na classe ModifiedJPATransaction, tenho:
|
 |
|
|
Lucas Cavalcanti wrote:faltou um ! no accepts do interceptor:
[]'s
Oi Lucas, obrigado por responder, mas eu fui depurar o código e percebi que não esta entrando no componente ModifiedJPATransaction.
Devo registrá-lo em algum local ?
|
 |
|
|
Estou seguindo a dica do Lucas, onde:
Criei a anotação @NoTransaction:
Criei o componente ModifiedJPATransaction herdando de JPATransactionInterceptor:
Coloquei as definições do componente JPA no web.xml:
Editei o meu DAOFactory e implementei o atributo EntityManager, um construtor e também o utilizei no método getUsuarioDAO:
NOTA: O PicoContainer esta injetando corretamente no construtor o EntityManager.
Meu Dao genérico ficou assim:
Em meu controller só implementei a anotação @NoTransaction em todos os métodos que julgo não ser necessário abrir e fechar transações com o Banco de dados:
Listagem retornando todos os registro corretamente:
Como pode ser visto acima, a listagem funciona perfeitamente bem e trás todos os registro na tela, porém ao executar um editar sobre um determinado registro, no exato momento que é chamado this.dao.getUsuarioDAO().selectByID(usuario.getId()) eu recebo a seguinte mensagem de erro:
O que estou fazendo de errado?
|
 |
|
|
Cara esse seu Filter só funciona utilizando JSF ou dá para utilizá-lo com JSP (jstl+el) + vRaptor ?
Caso seja positivo, teria como explicar a forma de utilização?
Estou iniciando um novo projeto e gostaria de aplicar teu código.
Obrigado e parabéns pela iniciativa; espero contribuir de alguma forma.
|
 |
|
|
Oi Lucas.
Concordo que as teclas de atalho do Eclipse ajudam muito.
Em relação a facilidade de leitura de código foi no sentido da anotação e não em relação ao nome do atributo, pois ao abrir uma classe e eu ver que alguns atributos estão anotados com @SessionScoped, @ApplicationScoped, etc..., me diz que em qualquer momento eu poderei atribuir e/ou recuperar valores que estão na sessão.
O comportamento seria parecido com a versão 2.6.0 ao utilizar @In @Out.
Em relação as transações (br.com.caelum.vraptor.util.jpa) eu havia entendido que os componentes opcionais do V|Raptor (Hibernate ou JPA) abriam e fechavam transações automaticamente para TODOS os métodos/lógicas de um Controller, sendo assim, existindo uma anotação @NoTransaction, estaria dizendo para o V|Raptor que naquele método/lógica não deverá abrir e fechar transações.
Eu gostei da dica de estender HibernateTransactionInterceptor, mas como estou usando JPA deve ter uma outra (exemplo: JPATransactionInterceptor), correto ?
PS: Muito obrigado por toda paciência e explicações...
|
 |
|
|
Lucas Cavalcanti wrote:vc está achando trabalhoso desenvolver em geral ou só essa parte da Session?
tem uma issue no VRaptor para implementar isso, mas a gente ainda não achou uma forma boa de fazer https://github.com/caelum/vraptor/issues/#issue/188
Não há nada de errado criar uma classe que encapsula um único valor, isso é até uma boa prática. É raro ter um int ou uma string perdida no sistema que não tenha um significado maior que possa ser colocada numa classe. É bem mais fácil dar manutenção depois se for uma classe do que se for um int espalhado pelo código, não é verdade?
E não é uma simples classe que só encapsula os valores, ela pode ter comportamento também. O seu paginator por exemplo poderia ser usado para cuidar dentro da paginação dos seus daos, com um método do tipo:
Ou seja, não é um trabalho a mais a toa, ele tem algumas vantagens.
Oi Lucas.
De certa forma eu concordo contigo, pois temos alguns benefícios ao implementar uma classe e utilizá-la em sessão, mas em casos muito simples é mais rápido utilizar uma anotação direto no atributo, pois acho trabalhoso no sentido de quantidade de código que terei que gerar ao implementar as classes...
Em comparação, até a versão 2.6.0 podíamos utilizar as anotações @In e @Out.
O qual não era muito elegante.
Sempre achei mais fácil de entendimento e codificação, utilizar apenas uma úncia anotação, por exemplo:
Com isso sei que eu posso enviar valores para a sessão e obtê-las a qualquer momento, pois a própria existências destas anotações sobre os atributos, faria com que o V|Raptor injetasse no Result automaticamente, já que o processo de Injeção de Dependência já esta implementado internamente.
"Veja que a própria leitura do código se torna mais simples."
Outra coisa!!!
Acredito que aqui não seja o local correto, mas gostaria de sugerir a implementação, no V|Raptor, de uma anotação @NoTransaction, para que esta seja utilizada em lógicas que não demandem transações com o banco de dados; isto é claro, utilizando os componentes opcionais (Hibernate e JPA).
Com isso teremos um ganho de recursos e melhoria de performance, pois em determinados locais não há a necessidade de transações, por exemplo:
Obrigado por toda ajuda até o momento.
|
 |
|
|
Lucas Cavalcanti wrote:quando vc fizer o redirect, vc pode passar os valores padrão
Lucas, vou implementar esta dica e depois coloco aqui o resultado.
Mas agora lhe faço outra pergunta.
E se eu tivesse apenas uma variáveis para ser colocado em SESSÃO, eu teria que criar uma classe e anotá-la com (@SessionScoped ou @ApplicationScoped e etc...) ?
Existe uma forma "Malcriada" de implementação para que o V|Raptor possa entender ?
Obrigado.
|
 |
|
|
Lucas Cavalcanti wrote:não dá pra usar <c:url> dentro dos attributos do displayTag...
vc tem que fazer algo assim, que talvez funcione:
tá certo o construtor do Controller sempre ser chamado, mas a instância do Paginator é a mesma dentro da Sessão do usuario.
se vc muda os parametros do paginator, mesmo assim ele volta pro valor inicial?
Oi Lucas!
Eu consegui acertar o valor correto para requestURI, veja:
Desta forma não recebo a mensagem de erro e os valores permanecem inalterados em sessão.
Já em relação ao DisplayTagInterceptor, que você me indicou, eu teria que colocar a anotação e receber os parâmetros na lógica "lista()" e como na minha lógica salva() eu faço um redirecionamento para lista(), terei que também anotar a lógica salva() para receber os parâmetros, correto ?
PS: Acho que não vai funcionar, pois salva() é chamado de outro JSP e nele não há o displayTag.
|
 |
|
|
Lucas Cavalcanti wrote:o jeito mais educado no VRaptor seria criar uma classe Session scoped:
receber essa classe no construtor do controller (ou de alguma outra classe que vc precisar disso) e interagir com ela.
vc pode colocar métodos mais representativos e úteis do que só os getter/setters
Valeu Lucas, eu fiz a implementação da tua dica!
Veja como ficou:
Em meu Controller:
Porém agora estou tendo problema no meu lista.jsp, veja o códgo:
Note que no parâmetro requestURI eu passo a url da logica "lista":
Mas o seguinte erro me retorna:
Porém este erro é por causa da chamada <c:url value="/usuario/lista"/>
Então se eu modifico para:
O erro não é disparado, no entanto o construtor do Controller é sempre chamado e os valores voltam para o "default".
Estou fazendo algo de errado ?
|
 |
|
|
Pessoal.
Estou com uma dúvida PRIMÁRIA com esta nova versão V|Raptor 3.2.0
Na versão 2.6.0 para colocar e receber valores na sessão eu fazia assim:
Desta forma em uma determinada lógica eu consigo atribuir valor para a sessão, exemplo:Já em outra lógica eu consigo obter/enviar o valor da váriável que esta na sessão, exemplo:
Com esta nova versão eu sei que tenho que utilizar o Result para enviar variáveis e seus valores, porém não sei como colocá-lo no escopo de sessão e como obtê-lo da sessão.
Alguém poderia me orientar, por favor ?
Exemplo de código que tenho atualmente:
Obrigado.
|
 |
|
|
|
|