Mostrando postagens com marcador Hibernate. Mostrar todas as postagens
Mostrando postagens com marcador Hibernate. Mostrar todas as postagens

quarta-feira, 27 de maio de 2015

Spring o que ? SPRING ROO !!!!!

Olá amigos do Preciso Estudar Sempre. Antes que vocês perguntem porque eu fiquei quase 1 mês sem publicar nada, eu já antecipo a resposta. Tempo, foi o que faltou. Assuntos não faltam embora sugestões sejam sempre bem vindas mas, sem tempo as coisas ficam difícies. Peço desculpa à todos pelo grande intervalo.

Bem, já que terminamos a parte mi mi mi, vamos falar de algo bom (e não é da texpix) ? Você já ouviu falar sobre o Spring Framework, né !? Aposto que sim mas, você já ouviu algo sobre os outros projetos da comunidade Spring ? Não ? Como não ?!  É amigo, eu imagino que você deve estar se sentindo assim:

"Ainnnn João, eu mal sei o Spring normal, quem dirá os outros projetos ??? O que eu faço agora ?? Ai meu deusssuuu"

Calma amigão, o mundo não vai acabar. A Spring community possuem vários projetos, não tem como você saber de todos mas, caso você queira conhecer eles, eu sugiro que você dê uma olhada no site. Deixarei linkado nas referências.

Um desses projetos é o Spring Roo. Com ele é possível criar sistemas com linhas de comando. Sim, você não leu errado, eu disse linhas de comando assim como, as que digitamos em um console de um sistema operacional.

Sua reação: "Meuuuuuu deuuuussuuuu, to passsadddaa, não acredittttôôô !!!"

Não irei explicar neste post o que significa inversão de controle e injeção de dependência. O intuito aqui não é esse. O que iremos abordar aqui hoje é como realizar a instalação do Spring Roo e como usar. É recomendado conhecimento pleno em programação e Java para que, seja possível absorver todo o conhecimento que estou tentando passar.

Agora que você já se recuperou do choque de que, é possível construir aplicações Java de uma forma veloz com linhas de comando, você se pergunta o motivo de usar isso na sua empresa e o que é na verdade esse framework.

Vamos retirar um trecho do manual (deixarei linkado nas referências):
Spring Roo is an easy-to-use productivity tool for rapidly building enterprise applications in the Java programming language. It allows you to build high-quality, high-performance, lock-in-free enterprise applications in just minutes. Best of all, Roo works alongside your existing Java knowledge, skills and experience. You probably won't need to learn anything new to use Roo, as there's no new language or runtime platform needed. You simply program in your normal Java way and Roo just works, sitting in the background taking care of the things you don't want to worry about. It's an approach unlike anything you've ever seen before, we guarantee it!
Segundo a documentação, o Spring Roo é uma ferramenta de fácil uso para construção rápida de aplicações corporativas na linguagem de programação Java. Ele permite que você construa aplicações com alta qualidade, performance e flexibilidade em poucos minutos. O melhor de tudo é que o Roo trabalha junto com o conhecimento, habilidade e experiências Java que já existem. Você provavelmente não precisará aprender nada novo para usar o Roo, pelo fato de não ser necessário nenhuma nova linguagem ou plataforma de execução. Você simplesmente programa da forma que sempre programou e o Roo simplesmente funciona, ficando no background da aplicação, tomando conta das coisas que você não quer se preocupar. É uma abordagem diferente de tudo que você já viu antes, nós garantimos isso.

Acho que não é necessário mais explicações sobre o que é o Roo e porque usar. Para podermos começar a usar o Roo, precisaremos:
  • Java 6 ou 7, com varíavel $JAVA_HOME instalada.
  • Maven, deixarei nas referências linkado como faz a instalação.
  • Spring Roo 3.11, clique aqui para baixar.
  • Console do seu sistema operacional.
OBS.: Estou usando o Windows.

Vamos começar a instalação do Spring Roo.

1 - Ponha o arquivo .zip do Spring Roo em uma pasta de sua preferência, e descompacte o arquivo.

2 - Depois de descompactado, abra seu painel de controle.

3 - Abra as variáveis do sistema.
Figura 1 - Tela das variáveis de sistema
4- Crie a variável de sistema ROO_HOME, onde seu valor será o lugar aonde você descompactou o arquivo com extensão zip.
Figura 2 - Instalação da variável de sistema ROO_HOME
5 - Edite a variável de sistema Path e adicione no fim do valor da variável (não se esqueça dos pontos e vírgula) o seguinte valor: %ROO_HOME%\bin
Figura 3 - Edição da variável Path
6 - Confirme as alterações e reinicie sua máquina.

7 - Abra o prompt de comando e digite roo, espere um pouco e a tela abaixo deverá ser exibida.
Figura 4 - Spring Roo
Agora que já terminamos a instalação da ferramenta, podemos começar a produzir. Como disse acima, iremos construir um sistema em poucos minutos e ele será web com acesso à um banco de dados através de um provedor. Mas antes de começarmos a construção precisamos definir um escopo para ele. Então, vamos pensar um sistema de um lava-carros. Esse sistema será bem simples, até porque senão for simples não conseguiremos terminar este post.

O dono do lava-carros, o sr Prohazca, nos contratou para a construção de um sistema onde, ele quer cadastrar seus funcionários, os carros dos clientes e os serviços de lavagem.

Depois do levantamento de requisitos, construímos o diagrama de classes.
Figura 5 - Diagrama de classe
Não nos preocuparemos com a simplicidade da modelagem, nosso intuito aqui é construir o sistema.

Podemos por a mão na massa e construir o sistema ?

Sim !! 

Crie uma pasta e nomeie como workspace_roo. Dentro dessa pasta crie uma pasta chamada lavacarros e abra o prompt de comando. Após aberto, acesse a pasta recém criada e execute o comando roo.

Execute os comandos abaixo:

 project --topLevelPackage br.com.lavacarros  

Este comando cria um projeto Maven. Nele é possível determinar o caminho de pacote. Este pacote será o nosso pacote de nível mais alto. Com base nele, nosso groupId será determinado. Podemos referenciar esse nosso pacote através do caractere ~.

O Spring Roo oferece um comando chamado hint. Esse comando oferece uma dica onde, ele indica qual o próximo passo tomar, por exemplo: Se você acabou de criar a pasta do projeto, iniciou o roo ali dentro, não sabe o que fazer e executou o hint, o roo ensinará como é possível construir um projeto. Essa ajuda é muito importante para usuários não tão experientes.

Temos agora algo parecido com isso:
Figura 6 - Estrutura do nosso projeto
Agora vamos determinar a camada de persistência da nossa aplicação.

 jpa setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY  

É possível especificar diversos provedores de persistência e bancos de dados. Para mais detalhes consulte o manual o qual, estará linkado aqui embaixo com os dados do nosso projeto.

Vamos criar nossas entidades agora. Execute o seguinte comando.

 entity jpa --class ~.model.entity.Carro --testAutomatically  

Lembra do ~ que citamos acima ? Aí está ele. Estamos informando ao comando entity que queremos criar uma entidade JPA no pacote entity, pertencente ao pacote model do nosso pacote principal. Note também que marcamos esse comando com --testAutomatically. Isso significa que nosso projeto já estará integrado com testes automatizados do Selenium. Execute o comando acima para as entidades Servico e Funcionario.

Já estamos quase terminado, aguenta firme !!

Vamos criar os atributos das nossas entidades. Vamos começar pela classe Servico.

 field number --fieldName id --type java.lang.Long --class ~.model.entity.Servico  
 field date --fieldName dtServico --type java.util.Date --class ~.model.entity.Servico  

Adicione agora os atributos da classe Carro.

 field number --fieldName id --type java.lang.Long --class ~.model.entity.Carro
 field string --fieldName placa --class ~.model.entity.Carro --notNull
 field number --fieldName ano --type java.lang.Integer --class ~.model.entity.Carro
 field string --fieldName marca --class ~.model.entity.Carro --notNull
 field string --fieldName modelo --class ~.model.entity.Carro

Os comandos são auto explicativos. Adicione os atributos da classe Funcionario,

 field number --fieldName id --type java.lang.Long --class ~.model.entity.Funcionario  
 field string --fieldName nomeCompleto --class ~.model.entity.Funcionario --notNull --sizeMax 100
 field number --type java.lang.Long --fieldName cpf --class ~.model.entity.Funcionario --notNull
 field number --type java.lang.Long --fieldName rg --class ~.model.entity.Funcionario --notNull
 field date --type java.util.Date --fieldName dtNascimento --class ~.model.entity.Funcionario

Agora que já adicionamos os atributos em nossas classes, vamos criar seus relacionamentos.

 field reference --fieldName funcionario --type ~.model.entity.Funcionario --class ~.model.entity.Servico  
field reference --fieldName carro --type ~.model.entity.Carro --class ~.model.entity.Servico --notNull

Falta muito pouco para terminarmos. Execute os seguintes comandos:

 web mvc setup
 web mvc all --package ~.web

O comando acima escaneia todo o projeto a fim de, analisar todas as entidades e criar a camada web pertinente à ela. O atributo package é usado a fim de especificar o pacote padrão para a camada web de nossa aplicação.

Pronto !!! Agora sim !!! Terminamos !! Podemos por para funcionar. Digite exit no roo e execute o comando:

 mvn tomcat:run  

Além de termos um sistema construído em poucos instantes, conseguimos realizar seu deploy através de comando único. É importante ressaltar que os comandos do maven só funcionarão, se a pasta corrente do prompt for onde está o arquivo pom.xml.

O Spring roo oferece suporte a segurança, utilizando Spring Security, entre outras características. Para baixar nosso projeto pronto com a documentação do roo e o diagrama de classes, clique aqui.

Sugestões ?! Críticas ?! Elogios ?! 

Deixe aí nos comentários ou na nossa página do facebook.


Referências:
Site oficial do Spring: https://spring.io/
Link para baixar Spring Roo: http://projects.spring.io/spring-roo/#running-from-shell
Instalação do maven: https://maven.apache.org/download.cgi - seção Installation Instructions
Nosso projeto: https://www.dropbox.com/s/f4v7361gkwkml61/workspace_roo.rar?dl=0
Leia Mais ››

terça-feira, 24 de março de 2015

Mapeamento objeto-relacional com JPA

Olá amigos do Preciso Estudar Sempre. Hoje falaremos sobre um assunto que muitas pessoas não conhecem de forma plena e só sabem utilizar copiando e colando soluções de outras pessoas. Hoje falaremos sobre mapeamento objeto-relacional com JPA. Mas, antes de tudo, vamos definir o que é o mapeamento objeto relacional.

Mapeamento objeto-relacional é técnica de desenvolvimento que possibilita utilizar a orientação à objetos em sua base de dados relacional mas, como isso funciona? Vamos supor que temos a tabela pessoa e que nesta tabela existem diversas colunas. Utilizando a ORM (Object-Relational Mapping), ou seja, o mapeamento objeto-relacional é possível criar uma classe Pessoa a qual, representará a tabela e com atributos os quais, representarão as colunas.

Esqueça a forma tradicional de se trabalhar com banco de dados. Quando se usa ORM, é somente necessário realizar alterações em nossas coleções de objetos que isto será refletido automaticamente no banco de dados e quando for necessário realizar querys, isso também não será feito da forma tradicional. Antes você manipulava tabelas, agora você manipula classes.

Neste post não abordaremos como realizar querys usando ORM, isto ficará para um próximo post. Hoje entenderemos o básico para poder evoluir depois.

Bem, vamos voltar ao assunto e eis aqui o nosso exemplo:

Figura 1 - Tabela pessoa
Figura 2 - Classe Pessoa
No exemplo acima temos a tabela pessoa e classe Pessoa, ambas mencionadas acima. Porém, não é necessário somente criar a classe e pronto, está funcionando. Faltam ainda umas coisas. O Java não entende automaticamente que tal classe reflete tal tabela. Para isto acontecer, é necessário anotar nossas classes. Se você não sabe o que é uma anotação, clique aqui e leia sobre o assunto.

As anotações que usaremos pertencem à JPA mas, o que é JPA ? Segundo à wikipedia, a JPA é:
Java Persistence API (ou simplesmente JPA) é uma API padrão da linguagem Java que descreve uma interface comum para frameworks de persistência de dados. A JPA define um meio de mapeamento objeto-relacional para objetos Java simples e comuns (POJOs), denominados beans de entidade. Diversos frameworks de mapeamento objeto/relacional como o Hibernate implementam a JPA. Também gerencia o desenvolvimento de entidades do Modelo Relacional usando a plataforma nativa Java SE e Java EE.
A explicação acima é bem clara e agora que já sabemos o que é JPA, podemos aplicar suas anotações na nossa classe Pessoa.

 @Entity  
 @Table(name="pessoa") 
 public class Pessoa implements Serializable{ 

      @Id 
      @Column(name="id", nullable=false) 
      @GeneratedValue(strategy = GenerationType.AUTO) 
      private Long id; 

      @Column(name="nome", nullable = false, length=100) 
      private String nome; 

      @Temporal(TemporalType.DATE) 
      @Column(name = "dataNasc", nullable = false) 
      private Date dataNascimento; 

      private String email; 

      @Column(name="altura", precision=2) 
      private Double altura; 

      @Column(name="peso", precision=3) 
      private Double peso; 

      @Column(name="rg", length=9, unique=true) 
      private Integer rg; 

     /*métodos gets e sets*/ 

 } 

Você deve ter notado que aplicamos várias anotações na nossa classe, vamos entender uma por uma:

@Entity -> Anotação de escopo de classe. Representa que nossa classe será uma entidade a qual, reflete uma entidade do banco de dados e assim, poderemos manipulá-las em querys e outras operações.
@Table -> Anotação de escopo de classe. Representa que nossa entidade refletirá uma tabela do banco de dados e é onde será definido mais informações sobre a tabela alvo.
  • name: Representa o nome da tabela.
@Id -> Anotação de escopo de atributo. Representa que aquele atributo refletirá a PK da nossa tabela.
@Column -> Anotação de escopo de atributo. Representa que o nosso atributo refletirá uma coluna do banco de dados.
  • name: Representa o nome da coluna.
  • nullable: Flag que representa que a coluna aceita valores nulos. Caso seja false, a coluna/atributos não aceita valores nulos, caso contrário, aceita.
  • length: Tamanho da coluna no banco de dados.
  • precision: Usado para valores de ponto flutuante. Representa a quantidade de casas decimais da coluna.
  • unique: Representa que a coluna é uma unique key
@GeneratedValue -> Anotação de escopo de atributo. O atributo que é marcado com essa anotação terá valores gerados automaticamente. Essa anotação é usada para PKs autoincrement.
  • strategy: Representa a forma que os valores serão gerados, podem ser gerador de forma automática, através de sequence, entre outras formas.
@Temporal -> Anotação de escopo de atributo. Esta anotação representa que a coluna será do tipo date.

Você deve ter notado que o atributo email não foi mapeado. Isto não está errado e foi feito de propósito. Quando sua classe é carregada e a JPA vê que um dos atributos não foi mapeado, ela procura uma coluna no banco de dados com o mesmo nome do atributo. Como é possível notar na figura 1, realmente existe uma coluna com o nome de email logo, isto não ocasionará em nenhum erro.

Porém, se você possuir em sua classe um atributo não mapeado e a JPA não encontrar nenhuma coluna que tenha o mesmo nome, isto ocasionará um erro. Atributos não mapeados que não representam colunas do banco de dados devem ser anotados com a anotação @Transient a qual, representa que um determinado atributo de uma classe serve para o transporte de dados (DTO).

Obviamente que existem milhares de anotações e eu não sei todas até porque, isso é humanamente impossível. Neste post, eu abordei as principais, as que são mais usadas nos projetos.

Deixo aí embaixo linkado um post que foi feito aqui no blog em que discutimos sobre outras anotações da JPA. Caso você queira um livro para aprender mais sobre as anotações da JPA, dê uma olhada neste post:
Roteiro de estudo para o livro EJB 3 Profisional - Java Persistence API: http://precisoestudarsempre.blogspot.com.br/2013/09/roteiro-de-estudo-para-o-livro-ejb-3.html

Para baixar o projeto pronto, clique aqui.

Sugestões ?! Críticas ?! Elogios ?! 

Deixe aí nos comentários ou na nossa página do facebook.


Referências:
Criar anotações, é possível ?: http://precisoestudarsempre.blogspot.com.br/2015/03/criar-anotacoes-e-possivel.html
@Embeddable e @Embedded no JPA: http://precisoestudarsempre.blogspot.com.br/2015/02/embeddable-e-embedded-no-jpa.html
Documentação @Column: http://docs.oracle.com/javaee/5/api/javax/persistence/Column.html
Documentação @Entity: http://docs.oracle.com/javaee/5/api/javax/persistence/Entity.html
Documentação @Table: http://docs.oracle.com/javaee/5/api/javax/persistence/Table.html
Documentação @Transient: http://docs.oracle.com/javaee/5/api/javax/persistence/Transient.html
Leia Mais ››

segunda-feira, 8 de setembro de 2014

Projeto Spring MVC para estudos

Pessoal vou por aqui zipado um projeto pronto para fins de estudo. O projeto possui as seguintes tecnologias:


  • Spring MVC , Core, ORM e AOP 3.1.2
  • JPA
  • Hibernate 4.1.7
  • JSP e JSTL 1.2
  • JasperReports 5.1.0
  • MySQL 5.1.18
  • Servlet 1.0.1
  • Tiles 2.2.2
  • Gson 2.2.4
  • Javax Mail 1.4.3
  • Tomcat v7.0.54

Leia Mais ››