Tag Archive for 'hibernate'

Controle manual de transações em testes unitários

Eu criei alguns testes unitários que se utilizam do Hibernate + Spring, facilitando e muito a minha vida para programá-los.

Mas porém, quando me deparei com algumas MATERIALIZED VIEWs do Oracle, que , somente são atualizadas quando é feito um commit, conforme foram criadas aqui no meu banco de dados, sendo assim, eu precisei fazer commit nas transações do Junit.

O que ocorre é que , eu utilizo como classe pai do meu teste unitário uma classe do Spring que controla as transações, abrindo uma para cada método de teste do TU, e faz com que em todos os momentos seja feito rollback no banco, fazendo com que meu teste unitário não reflita no banco de dados. O que me deixa com o mesmo ambiente de teste sempre, sem alteração. Esta classe é a AbstractTransactionalDataSourceSpringContextTests .

Para buscar o controle da transação corrente eu utilizei 3 métodos  bem interessantes, que estão disponíveis na classe mesmo, são eles:

setComplete() -> Chamando este método antes de terminar o TU, a transação será comitada, e não será feito o rollback padrão.
endTransaction() -> Fecha, acaba com a transação atual.
startNewTransaction() -> Abre, inicia uma nova transação

Assim eu consigo efetuar o commit quando preciso, e na hora em que preciso, persistindo assim os dados no meu banco de dados. Claro, que esta situação é uma exceção, onde eu salvo os dados no banco, que por si só atualiza minha materialized view, consulto novamente os dados para validação, e depois executo um teste de exclusão dos mesmos dados inseridos, comitando também.

Pulo de IDs com Jboss e Hibernate

Quando utlizamos ( no meu caso 0 JBoss ) , que trabalha com um pool de conexões, e com hibernate, utilizando sequences para geração de ID´s para as tabelas, pode ocorrer de estes ID´s serem gerados com um intervalo diferente do definido no banco. Por exemplo, na criação desta sequence oracle:

CREATE SEQUENCE TABELA_SEQ START WITH 1 INCREMENT BY 1;

Isto irá gerar por padrão uma sequence com cache de 20, ou seja, o oracle já aloca os 20 ids proximos para nao efetuar esta operação novamente no banco durante 20 iterações, ficando em memória e agilizando o processo.

Mas quando utilizamos um pool de conexões, isto nao deve ser feito, pois o cache é feito por conexão do banco, ou seja se o mesmo servidor tem 10 conexoes ao banco, quando uma delas efetuar um TABELA_SEQ.NEXTVAL, vai retornar o proximo id, digamos que seja 1, e irá guardar em memória até o 20. E se após isto, na outra conexão for executado o nextval novamente, irá retornar o 21. E não podemos gerenciar com qual conexão devemos ir ao banco, até pq daí nao teria necessidade de se ter um gerenciamento pelo application server !

Então o correto para criar a sequence é com o comando abaixo:

CREATE SEQUENCE TABELA_SEQ START WITH 1 INCREMENT BY 1 NOCACHE;

Spring + JPA/Hibernate

Eu estou com um problema ao trabalhar com estes dois fw dentro do MyEclipse, que é o seguionte:

Tenho no classpath do meu projeto as libraries “Spring 2.0 AOP” e “Hibernate 3.2 Core Libraries”, mas sempre quando vou rodar a aplicação, me retorna um erro com relação ah biblioteca “asm”, que é o seguinte:


.
.
01:13:03,010 INFO [STDOUT] 01:13:03,009 ERROR [[sceweb2]] Servlet.service() for servlet sceweb2 threw exception
java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
at net.sf.cglib.core.ClassEmitter.begin_class(ClassEmitter.java:77)
at net.sf.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:173)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145)
.
.

É pqtem a asm.jar e asm-2.2.3.jar que estão conflitando. Alguém sabe como retirar/trocar esta bibliotecas para o correto funcionamento do projeto ?

vlw..

Acesso a dados de banco de dados…

JPA ? JDBC Puro ? Somente Hibernate ? JDO ?
O que eu faço….?
Qual a mais simples solução para o acesso aos dados ?
Qual a mais robusta solução para acesso aos dados ?
Qual a solução de acesso aos dados que me dá mais ferramentas ?
Qual solução tem o melhor controle transacional ?
Qual a mais produtiva solução de acesso aos dados ?

Agora que estou estudando mais o Spring, e vi que o mesmo me possibilita o uso de todas as opções de acessos aos dados, fiquei com estas dúvidas… mas na verdade acho que vou fazer um belo teste com o JPA e se nao ficar legal, passo a usar o Hibernate puro, pego da fonte ! hhehehe

Spring Framework – A real framework !

Conversando com um colega de trabalho, obtive algumas informações sobre o Spring Framework.
Dentre estas informações, estavam uma que dizia que este fw era o que realmente podemos chamar de framework, onde o mesmo tinha tudo que
necessitávamos para construir uma aplicação do zero facil e rapidamente.
Ou seja, com o Spring fw, temos muitas facilidades, desde nossas classes de negocio, transações, classes de acesso a dados, model-view-controller, etc…
Podemos ler aqui (http://www.theserverside.com/tt/articles/article.tss?l=IntrotoSpring25) com mais detalhes o que o Spring tem a nos oferecer.

Eu sinceramente estou começando agora a aprender a trabalhar com Spring, mas já estou fascinado com tamanha produtividade oferecida por este fw.
E ainda mais quando entro no seu site, na seção de documentação e me deparo com uma documentação vasta, detalhada e muito bem organizada de
todas as suas funcionalidades e características ( http://static.springframework.org/spring/docs/2.5.x/reference/index.html ).

Na real, eu chequei até aqui através do aprendizado do JPA (Java Persistence API), e fiquei bem contente.

Agora, para complpetar o desenvolvimento de uma bela aplicação, basta aprender a programar o ext (http://www.extjs.com), uma biblioteca
java script que é muito completa, para objetos visuais, efeitos de páginas, ajax, e outras cositas mas !




Better Tag Cloud