segunda-feira, 27 de fevereiro de 2012

Como configurar um projeto web com Maven + Eclipse

Algum tempo atrás estava procurando como configurar a dupla Eclipse + Maven para um projeto web e não consegui encontrar em um único site as instruções para realizar a tarefa, então estou escrevendo este guia para auxiliar os desenvolvedores com a mesma dificuldade.

Uso o Maven apenas para gerenciar as dependências, portanto a configuração realizada foi a mais simples possível para rodar o projeto.

O primeiro passo é instalar o m2e. Caso esteja usando o Eclipse Indigo basta ir no menu Help, depois Eclipse Market Place. Digite na caixa de busca m2e e instale o plugin.

O próximo passo é criar um Maven Project. Vá em File, New, Other e então procure por Maven Project.

Selecione a opção Create a simple project. Preencha o Group Id e Artifact Id do projeto, em Packing escolha a opção war, por se tratar de um projeto web.



Com o projeto criado, clique com o direito no projeto e escolha Properties >> Project Facets >> Convert to faceted from...

Marque a opção Dynamic Web Module.

Clique em Further Configuration avaliable e altere o Content Directory para: /src/main/webapp. Pressione OK.



Agora faremos com que as libs gerênciadas pelo maven sejam incluidas no deploy. Vá novamente nas propriedades selecione Deployment Assembly >> Add >> Java Build Path Entries >> Maven Dependencies.



Pronto! Agora é só adicionar suas dependências no pom.xml.

Abraços

segunda-feira, 6 de fevereiro de 2012

Query polimorfica com interfaces - Hibernate

Fazer uma query polimórfica em entidades relacionadas através de herança é muito simples. Porém as vezes desejamos executar uma query que busque todas as entidades que possuem determinado comportamento em comum, mas que não são da mesma hierarquia. Aqui é comum ver o desenvolvedor implementar herança de maneira errônea, apenas para conseguir esta funcionalidade.

Obs: Este tópico possui uma ótima discussão à respeito de herança e como ela pode ser prejudicial ao seu código.

Vamos supor que tenhamos o conceito de notificável em nosso sistema e queremos buscar por todas as entidades "notificáveis".

Como posso ter diversas entidades notificáveis que não fazem parte de uma hierarquia seria um erro usar herança. Então implementamos Notificavel como uma interface.


public interface Notificavel {

    public void notifica();

}



Suponhamos que temos duas entidades em que serão notificáveis: Sistema e Pessoa.


@Entity

public class Sistema implements Notificavel { ...



@Entity

public class Pessoa implements Notificavel { ...




Então realizamos a busca com a seguinte HQL:

String hql = "FROM br.com.renan.domain.Notificavel";


Note que colocamos o nome totalmente qualificado da interface, isso é necessário para que o hibernate saiba exatamente por qual interface buscamos.

Note que assim você consegue buscar por todas as entidades que implementem a inteface.

E por fim o teste:


@Test

public void deveRetornarDoisVeiculos() {

    List notificaveis = notificador.lista();

    assertEquals(2, notificaveis.size());

}


Aqui é possível encontrar o código completo do projeto.

Abraços.