sexta-feira, agosto 10, 2012

DWR: The first project

DWR – Direct Web Remoting


DWR is a framework used to work with Ajax call on Java implementation. An Ajax call is an asynchronous request of the system resource, in other words, while the request is processed, the user can interact with other resource of the system until the response of the first request.


Is part of the Ajax call: HTML, XHTML, CSS, DOM XML, XMLHttpRequest, JavaScript. The great benefit of the Ajax utilization, certainly, is the possibility of providing better interaction of use with the application, build rich applications for web and finally there’s a better response time. 
In order to optimize the development of Java Applications using Ajax, the use of DWR is a good choice, because it is an OpenSource tool, it provides security calls to Java codes by integrable browser with the features of the main frameworks market. It encapsulates details and complexity of the implementation of XMLHttpRequest, and performs Java class conversion for a JavaScript implementation, this way, allowing the use of a browser.

The diagram below shows the DWR use in an Ajax request to Java implementation.
   

 
THE PROJECT

Using the Eclipse IDE, create a new Dynamic Web Project, as shown on the picture below.

 
To obtain the dwr.jar file, do the download that in: http://directwebremoting.org/dwr/downloads/index.html;
The DWR use the artifact commons-logging.jar, so, this file is necessary and can be obtained from: http://commons.apache.org/logging/
Copy the two files into the WEB-INF\lib of your project.
We must set the DWR servlet in our project, open the file web.xml of your project and add:


  DWR Servlet
  dwr-invoker  
  org.directwebremoting.servlet.DwrServlet
  
     debug
true dwr-invoker /dwr/*


It’s also necessary the creation of a file as shown below, this should be included on the WEB-INF directory of your project with the name dwr.xml.

  
    
          
  


After these settings have been done, the DWR should be ready to use. Start your server, in this tutorial was used the Tomcat7, and access your application as the following one:

 

Note that the Project lists the JavaScript to JDate, it contains the java.util.Date class in a JavaScript version, in other words, this class was converted to JavaScript.
This project shows the IMC calculus, in this case, the call for this method and the response presentation will be by Ajax. For this, create a new class as the following picture:
 

We implement the logic as:
package br.com.serjava.dwr;

public class CalculoIMCAjax {

 public String calcularImc(Double peso, Double altura) {

  Double imc = (peso / Math.pow(altura, 2));

  if (imc < 18.5) {
   return "Seu imc é: " + imc + " Abaixo de 18,5 Você está abaixo do peso ideal";
  } else if (imc >= 18.5 && imc < 24.9) {
   return "Seu imc é: " + imc + " Entre 18,5 e 24,9 Parabéns — você está em seu peso normal!";
  } else if (imc >= 24.9 && imc < 29.9) {
   return "Seu imc é: " + imc + " Entre 25,0 e 29,9 Você está acima de seu peso (sobrepeso)";
  } else if (imc >= 29.9 && imc < 34.9) {
   return "Seu imc é: " + imc + " Entre 30,0 e 34,9 Obesidade grau I";
  } else if (imc >= 34.9 && imc <= 39.9) {
   return "Seu imc é: " + imc + " Entre 35,0 e 39,9 Obesidade grau II";
  } else {
   return "40,0 e acima Obesidade grau III";
  }

 }
 
}


The next step will be the mapping of the class above as a DWR object, for this, you must edit the file dwr.xml and insert:

       


The last stage we are going to create the page that will show the content, creat, if it doesn’t exist, the page index.jsp into the WebContent directory, following the implementation below: 
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>




Insert title here
   
     
   
 
 






Altura (m)
Peso (kg)

The expected result will be:

 Wait for new posts!

Nota!


Olá pessoAll! 

Estive meio atarefado ultimamente, infelizmente, acabei deixando de atualizar o blog.

Nesta iniciativa de retomada, sempre tentarei realizar postagens duplas, sendo: em português e inglês.

A razão:  (a) felizmente, pelas estatísticas de acesso há um número razoável de acessos internacionais, assim, acredito que com isto o blog poderá alcançar mais público; (b) para aperfeiçoar meu inglês ;)

Espero que gostem, e obrigado pelos acessos e comentários!

quinta-feira, maio 31, 2012

Android: Apache Cordova

Olá estimados seguidores, obrigado pela constante visita e apreciação.

Hoje, resolve inovar um pouco a temática, vou abordar um start de desenvolvimento mobile com Android (que é em Java \o/) mas utilizando o projeto Cordova da Apache. Este projeto me chamou bastante a atenção, pois, como ele é possível que desenvolvamos aplicações mobile para Android :), iOs :) e até para o WindonwsPhone :( rsrs mas, deixando o preferencialismo de lado, sigamos!

Mas além do projeto Cordova se mostrar multiplataforma, o que é excelente, o que me deixou mais empolgado foi a forma de desenvolvimento, pois, "não" necessitamos, diretamente, utilizar a linguagem nativa de cada plataforma. Todo o desenvolvimento é realizado por meio de HTML e JavaScript, isso mesmo! Segmento este, que a maioria dos desenvolvedores estão(amos) acostumados.

O objetivo deste poste é mostrar a configuração do Apache Cordova num projeto Android (ahhh já testei no iOs, ficou show) e realizamos uma interação simples.

Obs: este post não irá demonstrar a configuração do ambiente de desenvolvimento android, é considerado que o mesmo já esteja devidamente pronto!

IMPLEMENTAÇÃO

Utilizando o Eclipse e o emulador android, o primeiro passo realizar o download dos artefatos do Cordova para serem acoplados ao projeto, o conteúdo está disponível em: http://incubator.apache.org/cordova/#download, ele já vem com um pacote de artefatos para cada uma das plataformas mobile citadas.

Feito isto, criaremos um projeto Android no Eclipse, com a seguinte configuração:


Tendo-se criado o projeto, na raiz do mesmo, crie uma pasta (folder) com o nome: lib
No diretório /assets, crie uma pasta (folder): www (path será: /assets/www);

Copie o arquivo cordova-1.7.0.jar (baixado no link acima) para o diretório lib;
Copie o arquivo cordova-1.7.0.js para o diretório www.
Finalmente, copie o diretório xml para /res;

Pronto! Neste momento, todas as dependência foram adicionadas. 

Para que o projeto tenha visibilidade aos fontes do Cordova, adicione o artefato cordova-1.7.0.jar no classpath da sua app mobile

Abra o arquivo AndroidManifest.xml, e adicione o seguinte conteúdo entre as tags <uses-sdk.../> e <application.../> :

<supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:resizeable="true"
        android:smallScreens="true" />

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />


Por último, adicione a propriedade android:configChanges="orientation|keyboardHidden"na tag <activity>, deste modo:
<activity
            android:name=".CordovaHelloActivity"
            android:label="@string/app_name" 
            android:configChanges="orientation|keyboardHidden">

Ufa! Acabaram-se as configurações!

Vamos ao desenvolvimento: crie dentro do diretório www, anteriormente criado, o arquivo index.html, que deverá conter:
<!DOCTYPE HTML>
<html>
<head>
<title>Cordova</title>
<script type="text/javascript" charset="utf-8" src="cordova-1.7.0.js"></script>
<script type="text/javascript">

 function mensagem() {
  navigator.notification.alert("Mensagem cordova app for android!", null , "Ser Java!", "Ok");
 }

</script>
</head>
<body>
<h1>Primeira aplicação Mobile em HTML</h1>
<input type="button" value="Acao" onclick="mensagem()"></input>
</body>
</html>

Observe que este conteúdo, nada mais é, que implementação HTML e JavaScript, este deverá originar uma página com um botão, e ao acionar este, uma mensagem deverá ser exibida.

Resta agora direcionarmos a Activity para a página criada, então abra a classe CordovaHelloActivity e edite do seguinte modo:

package br.com.serjava.cordovahello;

import android.os.Bundle;
import org.apache.cordova.DroidGap;

public class CordovaHelloActivity extends DroidGap {

 @Override
 public void onCreate(Bundle saveInstanceState) {
  super.onCreate(saveInstanceState);
  super.loadUrl("file:///android_asset/www/index.html");
 }
}



Para testar, publique sua aplicação no seu emulador android 4.03 ou dispositivo compatível, o resultado será:

Embora tenha um "trabalhinho" inicial de configuração, pessoalmente, achei bem bacana o desenvolvimento de apps mobile deste modo: usando-se HTML e javascript!

Espero que tenham gostado!

Para maiores informações, consulte a documentação preliminar do projeto Cordova acessando: http://docs.phonegap.com/en/1.7.0/index.html

segunda-feira, maio 07, 2012

JPA: ManyToMany

Olá PessoAll!

Primeiramente, gostaria de agradecer a todos que têm seguido e contribuído com a divulgação deste meu humilde blog e, pelos positivos feedbacks que tenho recebido. Fico feliz não apenas por apreciarem o conteúdo que disponibilizo, mas por contribuírem com a divulgação do amplo ecossistema Java, que sustenta desde grandes organizações até muitos de nós rs!


Neste post vou dar continuidade ao uso de relacionamentos com JPA, neste, verificaremos como implementar uma relação do tipo N:N (muitos para muitos - @ManyToMany). Para demonstrar este relacionamento, darei continuidade no projeto já iniciado nos posts de JPA anteriormente, até então temos a relação 1:N entre Produto e Categoria.

Contexto: do que já foi implementado até o momento, consegue-se categorizar os produtos, logo, facilmente obtemos todos os produtos de uma dada categoria. Imagine que queremos catalogar todos os produtos que um usuário (cliente) visite, para que futuramente, possa-se traçar um perfil de consumo. O que envolve nisto: logo, um usuário poderá ver mais de um produto, e um produto será visualizado por mais de um usuário, o que caracteriza a relação N:N.

Modelagem

Como dito, teremos um relacionamento N:N entre cliente e produto, para contemplar este requisito, nossa modelagem ficará da seguinte forma:


Para efetuarmos as alterações, temos o seguinte sql:

create table cliente (
id_cliente serial,
nome  varchar(70),
primary key (id_cliente));

create table cliente_produto_rel (
id_cliente integer,
id_produto integer,
primary key (id_cliente, id_produto),
foreign key (id_cliente) references cliente (id_cliente),
foreign key (id_produto) references produto (id_produto));

IMPLEMENTAÇÃO

O primeiro passo, é procedermos a modelagem ORM da nova entidade (cliente) e realizar o mapeamento bi-direcional entre cliente e produto. Assim, temos:


Cliente:
package br.com.serjava.persistencia.entity;

//imports omitidos

/**
 * The persistent class for the cliente database table.
 * 
 */
@Entity
public class Cliente implements Serializable {
 private static final long serialVersionUID = 1L;

 @Id
 @SequenceGenerator(name="CLIENTE_IDCLIENTE_GENERATOR", sequenceName="CLIENTE_ID_CLIENTE_SEQ", allocationSize=1)
 @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="CLIENTE_IDCLIENTE_GENERATOR")
 @Column(name="id_cliente")
 private Integer idCliente;

 private String nome;

 //bi-directional many-to-many association to Produto
 @ManyToMany
 @JoinTable(
   name="cliente_produto_rel"
   , joinColumns={
    @JoinColumn(name="id_cliente")
    }
   , inverseJoinColumns={
    @JoinColumn(name="id_produto")
    }
   )
 private List listaProdutos;

        //getters and setters
Produto:
package br.com.serjava.persistencia.entity;

//imports omitidos
/**
 * The persistent class for the produto database table.
 * 
 */
@Entity
public class Produto implements Serializable {
 private static final long serialVersionUID = 1L;

 @Id
 @SequenceGenerator(name="PRODUTO_IDPRODUTO_GENERATOR", sequenceName="PRODUTO_ID_PRODUTO_SEQ")
 @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="PRODUTO_IDPRODUTO_GENERATOR")
 @Column(name="id_produto")
 private Integer idProduto;

 @Column(name="nm_produto")
 private String nomeProduto;

 private Integer quantidade;

 private Double valor;

 //bi-directional many-to-many association to Cliente
    @ManyToMany(mappedBy="listaProdutos")
 private List listaClientes;

 //bi-directional many-to-one association to Categoria
    @ManyToOne
 @JoinColumn(name="id_categoria")
 private Categoria categoria;

Observe que ambas entidades, Cliente e Produto, possuem uma List referenciando-se uma a outra, o que caracteriza o relacionamento N:N. No mapeamento da entidade Cliente, observe que o join que interliga as 2 entidades por meio da entidade rel, é realizado por meio da anotação própria: @JoinTable.

Devemos criar a camada de persistência da nova entidade, Cliente. Faça de forma análoga as demais entidades (em caso de dúvidas consulte os posts anteriores sobre JPA).

Considerando que já temos produtos persistidos no database, vamos recuperá-los e associálos a um novo cliente que supostamente está visitando aqueles produtos em uma página; como o método save implementado no dao genérico (DAOImpl) retorna o objeto persistido (cliente), conseguiremos também obter os produtos associados ao cliente, por meio da relação, como mostra a implementação:


ProdutoDAO produtoDAO = new ProdutoDAOImpl();
  ClienteDAO clienteDAO = new ClienteDAOImpl();
  
  //obtem-se a lista de produtos salvos 
  List<Produto> listaProdutosVisitados = produtoDAO.getAll(Produto.class);
  
  Cliente cliente = new Cliente();
  //atribuição dos produtos a um cliente
  cliente.setListaProdutos(listaProdutosVisitados);
  cliente.setNome("Fábio");
  
  //salva e obtém um cliente sincronizado com o BD
  Cliente clienteSalvo = clienteDAO.save(cliente);
  
  System.out.println("Nome cliente: " + clienteSalvo.getNome());
  System.out.println("Produtos visitados (associados) ao cliente:");
  
  //percorre a lista de produtos associados ao cliente salvo
  for (Produto produto : cliente.getProdutos()) {
   System.out.println(produto.getNomeProduto());
  }

Observe que a relação no banco dá-se mediante a tabela de "rel" entre cliente e produtos. Mas em qual momento fizemos a relação dos identificados das entidades Cliente e Produto? A resposta é: quando atribuímos a lista de produtos ao objeto de cliente, e o JPA realizou todo o trabalho "braçal" pra gente. Veja a tabela associativa como ficou:


Neste exemplo, observe que temos 3 produtos com os ids: 16, 22 e 23. Lembre-se que recuperamos TODOS os produtos para, em seguida, associá-los ao cliente. O cliente Fábio tem o id 4. Logo, se os 3 produtos estão associados ao cliente 3, na tabela de rel, vemos tal relação contemplada!

Observe quanto trabalho o JPA lhe poupou! Espero que tenham gostado!

quinta-feira, abril 26, 2012

Maven: múltiplos projetos interdependentes

Dando continuidade a temática que envolve maven, mais especificamente, de ferramentas para controle de dependências (artefatos) e build automático, vou abordar como se dá o trabalho e relação de múltiplos projetos no contexto do maven.

A necessidade de se utilizar múltiplos projetos para a construção de uma aplicação acarreta grandes vantagens, principalmente, quanto a melhores práticas e um melhor design arquitetural da aplicação; pois, assim, pode-se estabelecer de forma mais impositiva maior coesão e menor acoplamento. Em termos mais práticos, pode-se construir uma aplicação modularizada de forma bastante prática e eficaz.

Escopo
Deseja-se criar uma aplicação modular, onde as responsabilidades de persistência, negócio e visualização devem ser desacopladas. Adotaremos como solução a criação de 3 projetos, um para cada finalidade.

O diagrama, a seguir, ilustra a estrutura a ser criada:
Pelo diagrama, observa-se que a camada de View irá ter visibilidade (dependência) a camada de negócio e, esta última visibilidade a camada de dados/persistência.

Construção

Como já discutido nos posts anteriores sobre maven, este utiliza o arquivo pom.xml para estabelecer a estrutura, dependências e uma série de diretrizes inerentes ao build do projeto. Como visto no diagrama, entende-se, preliminarmente, que teremos 3 projetos que possuirão interdependência, logo 3 arquivos pom.xml, correspondentes a cada projeto individual.
Está correto, como uma ressalva: será necessário a criação do pom pai (parent pom.xml). Este arquivo pom não fará correspondência a nenhum projeto, será apenas um arquivo para a gerência macro dos 3 módulos.

O primeiro passo será a criação do parent pom, para tanto crie um arquivo no seu editor de textos simples e salve-o num diretório de sua preferência (este diretório que irá conter o projeto em seguida), com o nome de: pom.xml. Neste arquivo, cole o seguinte conteúdo:



  4.0.0

  com.serjava.app
  app
  1.0-SNAPSHOT
  pom

  
   
  

Observe que definimos o groupId como: com.serjava.app, e o nome de app ou artifactId como: app. Salve o arquivo, e vamos proceder a criação dos projetos.

No prompt de comando/terminal acesse o diretório onde o arquivo foi salvo, e crie os projetos como:

Projeto: app-web

Durante o processo de criação será solicitado uma versão, informe: 1.0 (snapshot); posteriormente, será apresentado um resumo das parametrizações, informe Y para confirmar e tecle enter.

Feito isto o projeto web já foi criado!

Façamos 2 observações:
Abra o arquivo pom.xml criado inicialmente, no diretório raiz do projeto, verifique que houve uma alteração:

Observe que um módulo foi imputado automáticamente, isto significa que: o projeto criado (app-web) será gerenciado, também, pelo parent pom!

A segunda observação é: abra o pom.xml do projeto criado: <<diretorio escolhido>>\app-web\pom.xml, e veja, dentre as demais tags de configuração a tag <parent>, esta faz referência ao parent pom (pom pai) criado inicialmente:

    app
    com.serjava.app
    1.0-SNAPSHOT
  

Projeto: app-business

A única diferença deste projeto para o primeiro foi a alteração do seu nome, e archetypeArtifactId para quickstart, pois é apenas um projeto para a lógica de negócios, não compreende estrutura web.

Projeto: app-dao

Neste momento deveremos dispor dos três projetos: web, business e dao, todos gerenciados pelo parent pom, criado incialmente! Verifique o arquivo pom parent, na tag module, deverá terem sido incluídas mais 2 módulos.

Os projetos já estão devidamente criados segundo o diagrama, resta-nos, agora, adicionar as dependências citadas. Conforme entendido, o projeto web terá visibilidade apenas ao projeto de business, portanto, teremos que adicionar a dependência. Abra o arquivo pom.xml do projeto app-web, e modifique-o como a seguir:

  4.0.0
  
    app
    com.serjava.app
    1.0-SNAPSHOT
  
  com.serjava.app
  app-web
  1.0
  war
  app-web Maven Webapp
  http://maven.apache.org
  

    
      com.serjava.app
      app-business
      1.0
      compile
    


    
      junit
      junit
      3.8.1
      test
    
  
  
    app-web
  

Observe que uma dependência foi incluída, referenciando-se aos dados de criação do projeto app-business, esta inclusão permitirá acesso chamada de métodos do projeto app-business, a partir do projeto app-web; assim, estaremos delegando toda a lógica de negócio desta fantástica aplicação a um projeto único e específico a isto, permitindo que o projeto web trate apenas de manipulações de pertinentes a visualização.

Finalmente, devemos adicionar a dependência do projeto dao ao projeto business. Ressalto que: o projeto business será para o processo de negócio e não persistência de dados (seja em database, arquivo, etc), para persistir temos o projeto específico de Data Access Object. Utilizando esta estrutura, assumimos que todos os detalhes e especificidades de acesso a dados estarão contidas no projeto DAO.

Edite o arquivo pom.xml do projeto app-business e inclua a seguinte dependência:

  4.0.0
  
    app
    com.serjava.app
    1.0-SNAPSHOT
  
  com.serjava.app
  app-business
  1.0
  app-business
  http://maven.apache.org
  

    
      com.serjava.app
      app-dao
      1.0
      compile
    


    
      junit
      junit
      3.8.1
      test
    
  


Concluída a edição nosso projeto poderá ser devidamente implementado, seguindo o fluxo: app-web faz uma requisição ao app-business, este, por sua vez, realiza a lógica de negócio e faz as chamadas necessárias para acesso aos dados, no app-dao.

Todos os arquivos devidamente salvos, testaremos o empacotamento, gerando um package, digite o seguinte comando no prompt/terminal, esteja ciente que está dentro do diretório pai, e não em algum projeto específico:

mvn clean package

O resultado esperado deverá ser:

Verifique BUILD SUCESS! Pronto, basta partir para a codificação.

Num post futuro, mostrarei como fazer o deploy de uma aplicação diretamente a um servidor web por meio do maven, não perca!

quinta-feira, março 29, 2012

Persistência - JPA: OneToMany e ManyToOne


Ola PessoAll!

Dando continuidade a temática de Persistência de dados, demonstrarei neste post, a implementação do relacionamento de cardinalidade 1:N (1 para N), o que implica o uso das annotations: @ManyToOne e @OneToMany.

Como já visto em posts anteriores, o uso de frameworks ORM agregam bastante facilidade e agilidade no desenvolvimento de aplicações; sabe-se que modelagens de dados propiciam a coexistência de sua estrutura, ou seja, priorizam (na maioria das vezes) o uso de relacionamentos, ou seja, objetos de banco não têm muita significância quando isolados.

Para a obtenção de informações coesas, bem como, significantes ao contexto de negócio, o uso de relacionamentos é imprescindível, desta forma, saber manipular os relacionamentos no contexto ORM é significativamente importante.

Segundo a documentação da especificação JEE 6 (http://docs.oracle.com/javaee/6/tutorial/doc/bnbqa.html#bnbqh), tem-se:

  • One-to-many: An entity instance can be related to multiple instances of the other entities. A sales order, for example, can have multiple line items. In the order application, Order would have a one-to-many relationship with LineItem. One-to-many relationships use the javax.persistence.OneToMany annotation on the corresponding persistent property or field.
  • Many-to-one: Multiple instances of an entity can be related to a single instance of the other entity. This multiplicity is the opposite of a one-to-many relationship. In the example just mentioned, the relationship to Order from the perspective ofLineItem is many-to-one. Many-to-one relationships use the javax.persistence.ManyToOne annotation on the corresponding persistent property or field.

Será utilizado o projeto Persistência constituídos nos posts anteriores para a implementação. Ao trabalho!

A MODELAGEM

No nosso banco de dados que abrigava o cadastro de produtos, criaremos a tabela Categoria e o devido relacionamento com produto, conforme modelagem:
O script para a criação da tabela Categoria e inclusão do relacionamento em Produto, segue:

create table categoria (
id_categoria serial,
nome  varchar(45) not null,
descricao varchar(200),
fg_ativo boolean,
primary key (id_categoria));

alter table produto
add column id_categoria   integer;

alter table produto
add constraint categoria_id_categoria_fk 
foreign key (id_categoria) references categoria (id_categoria);



IMPLEMENTAÇÃO

Feitas as alterações procederemos ao mapeamento, que deverá ser constituído da seguinte forma:

Produto:
package br.com.serjava.persistencia.entity;

//imports omitidos
@Entity
@Table(name="produto")
@SequenceGenerator(name="produto_id_produto_seq", sequenceName="produto_id_produto_seq", allocationSize=1)
public class Produto implements Serializable {

 private static final long serialVersionUID = -8121617132071401241L;

 @Id
 @GeneratedValue(generator="produto_id_produto_seq", strategy=GenerationType.SEQUENCE)
 @Column(name="id_produto")
 private Integer idProduto;
 
 @Column(name="nm_produto")
 private String nomeProduto;
 
 @Column(name="quantidade")
 private Integer quantidade;
 
 @Column(name="valor")
 private Double valor;

//relacionamento com categoria
 @ManyToOne
 @JoinColumn(name="id_categoria", referencedColumnName="id_categoria")
 private Categoria category;

//getters and setters


Categoria:
package br.com.serjava.persistencia.entity;

//imports omitidos

@Entity
@Table(name="categoria")
@SequenceGenerator(name="categoria_id_categoria_seq", sequenceName="categoria_id_categoria_seq", allocationSize=1)
public class Categoria implements Serializable {

 private static final long serialVersionUID = -8765631845563878481L;

 @Id
 @GeneratedValue(generator="categoria_id_categoria_seq", strategy=GenerationType.SEQUENCE)
 @Column(name="id_categoria")
 private Long idCategoria;
 
 @Column(name="nome", nullable=false)
 private String nome;
 
 @Column(name="descricao")
 private String descricao;
 
 @Column(name="fg_ativo")
 private Boolean ativo;
 
 @OneToMany(mappedBy="categoria")
 private List<Produto> listaProdutos;
//getters and setters

Observe que na entidade Produto temos um objeto de Categoria, pois, de acordo com o modelo elaborado, um produto tem uma categoria; já na entidade Categoria, note a existência de uma lista de Produtos, o que indica que uma categoria pode estar associada a N produtos.

Atenção! O atributo mappedBy presente na annotation @OneToMany, presente na entidade Categoria, deve conter a nomenclatura dada ao objeto que referencia-se a uma categoria na entidade Produto!

Na entidade Produto, temos a anotação @JoinColumn (você deve estar pensando: Nossa é aqui que o join é feito? SIM!), seus atributos namereferencedColumnName significam, respectivamente, o nome do atributo correspondente a foreign key de categoria na tabela produto (no banco de dados) e o nome da primary key representativa da tabela Categoria!

O próximo passo é a criação do objeto de acesso a dados (DAO) para a entidade Categoria. Felizmente nosso projeto está usando a arquitetura DAO Genérico, o que nos poupará bastante trabalho. A criação de CategoriaDAO e CategoriaDAOImpl deverá ser feita de forma análoga a Produto, para não ser repetitivo, verifique nos posts anteriores (em caso de dúvidas consulte: Persistência - DAO Genérico).

Para efetivarmos o relacionamento, criaremos 2 Produtos e os vincularemos a uma dada Categoria, na classe main:

public static void main(String... args) {
  
  ProdutoDAO produtoDAO = new ProdutoDAOImpl();
  
  CategoriaDAO categoriaDAO = new CategoriaDAOImpl();
  
  Categoria categoria = new Categoria();
  categoria.setNome("Livros Informática");
  categoria.setDescricao("Livros de desenvolvimento, banco de dados...");
  categoria.setAtivo(true);
  
//Categoria é salva no banco e recuperada - uso do merge, ou seja, tem-se o objeto categoria
// sincronizado no contexto de persistência
  categoria = categoriaDAO.save(categoria);
  
  Produto produto = new Produto();
  produto.setNomeProduto("Head First - Java");
  produto.setQuantidade(11);
  produto.setValor(99.99);
  //atribui a cateogira Livros Informática ao produto
  produto.setCategoria(categoria);
  
  Produto produto2 = new Produto();
  produto2.setNomeProduto("Head First - Servlets and JSP");
  produto2.setQuantidade(55);
  produto2.setValor(128.99);
  //atribui a cateogira Livros Informática ao produto
  produto2.setCategoria(categoria);
  
  
  //salva-se os produtos
  produtoDAO.save(produto);
  produtoDAO.save(produto2);
  
  List<Produto> listaProdutosCadastrados = produtoDAO.getAll(Produto.class);
  
  for (Produto p : listaProdutosCadastrados) {
   System.out.println(p.getNomeProduto());
  }

 }

O resultado esperado é a inserção de 2 produtos vínculados a categoria criada. Vejamos o resultado no banco:
Observe que foi criada a Categoria 3 - Livros Informática, e os produtos 22 e 23, vinculados a esta categoria, pelo código 3!

Espero que tenham gostado!

sexta-feira, março 16, 2012

Java One 2011 Presentation

Olá SeresJava!

Achei prudente divulgar, a Oracle disponibilizou os slides do Java One 2011, vale a pena conferir: