Certificação SCJP – Atribuições – Parte 1

•março 19, 2010 • Deixe um comentário

Depois de muito tempo sem postar nada irei hoje dar continuidade ao post anterior (Certificação SCJP – Orientação a Objetos), irei abordar aqui a terceira parte do estudo sobre a certificação – Atribuições – Parte 1.

Objetivos abordados:

1.3 (Já Abordado) Desenvolver código que declare, inicialize, e use primitivos, arrays, enuns, e objetos como static, instância e variáveis locais. Também, usar identificadores válidos para nomes de variáveis;

7.6 Escrever código que aplique corretamente os operadores apropriados incluindo operadores de atribuições (limitado a: =, +=, -=, *= e /=)

Visão Global de Stack e Heap

Entender o básico sobre stack e heap tornará muito mais fácil a compreensão de assuntos como passagem de argumentos, polimorfismo, threads, exceptions, e garbage collection.

A maior parte dos pedaços dos programas como métodos, variáveis e objetos vivem em um dos dois lugares na memória: stack ou heap.

Um heap é uma estrutura de dados organizada como árvore binária, seguindo algumas regras.

Um stack ou pilha é uma estrutura de dados baseado no princípio Last in First Out – LIFO (último a entrar, primeiro a sair)

  • Variáveis de Instância e objetos se localizam na heap
  • Variáveis locais se localizam na stack

package scjpatribuições.exemplo1;
class Raca{
}
public class Animal {

 Raca r; //Variável de Instância
 String nome; //Variável de Instância

 public static void main(String args[]){
 Animal a; //Variável local 'a'
 a = new Animal();
 a.raca(a);
 }

 public void raca(Animal animal){ //Variável local 'animal'
 r = new Raca();
 animal.setNome("Girafa");
 }

 public void setNome(String animalNome){ //Variável local 'animalNome'
 this.nome = animalNome;
 }
}

Observe o que acontece na stack e heap quando o programa acima é executado:

  • Linha 9 – main() é colocado na stack (pilha);
  • Linha 10 – a variável de referência ‘a’ é criada na stack porém não há nenhum objeto ainda;
  • Linha 12 – é criado o objeto Animal e associado para a variável ‘a’;
  • Linha 13 – Uma copia da variável de referência ‘a’ é passado para o método ‘raca’;
  • Linha 15 – raca() é colocado na stack com o parâmetro ‘animal’ como variável local (stack);
  • Linha 16 – é criado o objeto Raca na heap, e associado à variável de instância da classe Animal;
  • Linha 17 – setNome() é adicionado na stack com o parâmetro ‘animalNome’ como variável local (stack);
  • Linha 21 – a variável de instância ‘nome’ referência para o objeto String;
  • Podemos notar que duas variáveis locais diferentes referenciam o mesmo objeto Animal (na heap): ‘a’ e ‘animal’;
  • Podemos notar também que uma variável local (‘animalNome’) e uma variável de instância (‘nome’) referenciam a mesma string “Girafa” na heap;
  • Após a linha 21 completa, setNome é removido da stack com isso a variável local ‘animalNome’ desaparece também apesar de o objeto ainda está sendo referenciado na heap. E o mesmo acontece para os outros métodos e variáveis.

Literais, atribuições e variáveis (Objetivos 1.3 e 7.6)

Um literal primitivo é uma representação de código dos valores de um tipo primitivo, sendo eles: inteiros (10), pontos flutuantes (25.4), booleanos (true), caracteres (‘a’).

  1. Inteiro: Os números inteiros podem ser representados de 3 maneiras: decimal ( base 10 ), octal ( base 8 ) e hexadecimal ( base 16 )
  2. Inteiro Decimal: São os inteiros na forma como o conhecemos e em Java são representados sem utilizar qualquer prefixo ou tipo, como: int size = 20;
  3. Inteiro Octal: Os inteiros octais usam apenas os dígitos de 0 a 7. Para representar em Java um valor Octal basta por um ’0′ em frente ao numero, como abaixo:
    package scjpatribuições.exemplo2;
    
    public class octal {
      public static void main(String args[]){
    
        int seis = 06;
        int sete = 07;
        int oito = 010;
        int nove = 011;
    
        System.err.println("Octal 010 = "+oito);
        System.err.println("Octal 08 not exists = "+08); //Causará um erro dizendo que o valor é muito grande
      }
    }
    
  4. Inteiro Hexadecimal: Os inteiros hexadecimais usam 16 símbolos distintos de 0 a 15. A partir do valor 10 ao 15 usamos caracteres alfabéticos desconsiderando a regra do Case-sensitive: 0 1 2 3 4 5 6 7 8 9 a b c d e f. Vale ressaltar que após o prefixo 0x pode-se apenas incluir 16 dígitos
    package scjpatribuições.exemplo3;
    
    public class hexadecimal {
     public static void main(String args[]){
     int um = 0X0001;
     int um_tambem = 0x0001;
     long nove = 0x9L; // Podemos utilizar Long adicionando no valor o sufixo 'L'
     int dez = 0xa;
     int onze = 0xb;
     System.err.println("hexadecimal = "+dez);
     }
    }
  5. Pontos flutuantes: Composto por um numero decimal e frações. Para declarar podemos utilizar double (64 bits) ou float (32 bits):
    double a = 32.221D;
    double a1 = 32.221;
    float b = 11.475F;
    float b1 = 11.475;
  6. Booleanos: podem apenas ser definidos com true ou false;
  7. Caracteres: são representados utilizando o tipo char e entre aspas simples. Podemos utilizar valores hexadecimais colocando no inicio \u:
    char a = 'a';
    char var = '@';
    char n = '\u004E';
    char var1 = 0x892;
    char var2 = 982;
    char var3 = -98;
    char var4 = '\n'; //nova linha
    char var5 = '\"' //aspas duplas

Operadores de atribuições

No que se diz respeito a atribuições, é importante que você saiba que para os tipos primitivos os bits representam um valor numérico. Então para atribuir um valor basta você utilizar o operador = e o valor à direita será associado à variável a direita. Se você atribuir o valor 6 a uma variável o padrão de bits que estará armazenado no deposito é igual a 00000110.

Só que ai surge uma pergunta, e o que acontece quando não utilizamos variáveis primitivas como uma String, JButton, JTextField?

String s = new String("string");

JButton b = new JButton();

JTextField tf = new JTextField();

Em ‘s’, ‘b’ e ‘tf’ apenas estará armazenado uma variável referenciando o objeto correspondente, ou seja, uma variável de referência. Ai você se pergunta, no caso da String num seria “string”? Não pois não sabemos como o construtor desse objeto está trabalhando e não precisamos saber, pois a maneira como essas referencias a objetos são armazenadas é específicas de máquinas virtuais. Apenas saiba que o valor dessas variáveis não é o objeto. Então agora trabalharemos com as variáveis primitivas.

Atribuições primitivas

Existe atualmente 12 operadores de atribuição mas apenas 5 caem no exame. Legal não é? Você pode atribuir valor a uma variável primitiva utilizando um valor literal ou uma expressão.

int x = 8;

int y = 1 + x;

double z = x / y;

É importante saber que o literal inteiro como o 8 é implicitamente inteiro. Duvida? e se eu fizer isso:

byte b = 30;

é possivel? é sim. Quando fazemos isso o compilador automaticamente converte o valor literal para byte. Ou seja o compilador aplica um cast

byte b = (byte) 30;

isso se aplica para char e short pois atribuímos um valor menor do que um tipo int. Ai vai uma pergunta, podemos fazer a soma de bytes? sim e não! Quando tentarmos atribuir a um byte a soma de bytes o seu compilador irá acusar de que há a possibilidade de perder a precisão. Porém existe uma forma de ser fazer isso, veja:

byte a = 8;

byte b = 3;

byte d = b+a; // Erro! possible loss of precision.

byte e = (byte) b+a; // Ainda ocorre a possibilidade de se perder a precisão porém nós forçamos.

Conversão (Casting) de primitivos

Nós fizemos uma conversão explicita no código anterior. A conversão implícita ocorre quando fazemos uma transformação que envolva ampliação, ou seja, quando inserimos um item menor do que o container.

int a  = 10;

long b = a;

Atribuindo Números de Pontos flutuantes

Pontos flutuantes tem um comportamento parecido com os tipos Inteiros, porém com algumas modificações. É importante saber que todo literal de pontos flutuantes é implicitamente um double (64 bits) e não um float. Isso quer dizer que se você tentar atribuir um literal double a um float (64 em 32 bits) ele acusará erro. Para fazer isso é necessário fazer o casting forçado, veja como:

float f = 32.3; //Erro: cannot convert from double to float

float f = 32.3F; //pode ser feito dessa forma,

float f = 32.3f; // ou dessa,

float f = (float)32.3; // ou dessa.

Atribuindo valores inválidos para uma variável

Um exemplo de atribuição inválida ocorre quando tentarmos fazer isto:

byte a = 128; // byte pode apenas armazenar 127

Podemos corrigir isso adicionando o cast

 byte a = (byte) 128;

int b = (int) 32.3;

o que acontece então? quando fazemos o cast forçado algumas informações podem ser perdidas e é exatamente isso que acontece. Ficando o valor 32 na variável ‘b’ e -128 na variável ‘a’. Para entender porque isso acontece com byte é recomendado que estude um pouco mais sobre bytes =D. O que vale dizer aqui é que podemos forçar o cast de alguns literais, porém podemos perder algumas informações. Outra coisa importante podemos vê agora, você se lembra quando tentamos fazer a soma de bytes sem o cast?

byte a = 7;

a = a+3; // Erro

a = (byte) (a+3); // Válido

Podemos fazer isso dessa forma também:

byte a = 7;

a += 3; // Válido

Quando utilizamos o operador +=, -=, *= ou /= automaticamente é adicionado um cast explicito. Não esqueça, no exame isso pode ser uma pegadinha! =D

Atribuindo uma variável primitiva para outra

Nada muito complicado acontece quando atribuímos a uma variável um valor de outra. Observe:

int a = 10;

int b = a;

Quando fazemos isso dizemos que o valor de ‘b’ [seqüência de bits] é o mesmo valor de ‘a’, ou seja, eles não referenciam o mesmo valor na heap e sim possuem o mesmo valor (copia) em lugares diferente na heap. Se alterarmos o valor de ‘b’ isso não afetará em nada no valor de ‘a’. Just this.

Atribuindo variáveis de referência

Podemos atribuir a uma variável de referencia um objeto criado recentemente da seguinte forma:

String a = new String();

Como foi explicado antes (stack e heap) 1º é criado a variável de referência ‘a’ de tipo String , 2º é criado um novo objeto String na heap e 3º atribui a variável a ao objeto String criado recentemente na heap. Podemos também atribuir null indicando que a variável não referencia nenhum objeto.

Escopos de Variáveis

Observe o código:

class exemplo {

static int e = 20; // Variável statica

int x; // Variável de Referência

{ x = 7; int x2 = 5;} // Bloco de inicialização

exemplo() { x+= 8; int x3 = 6;} // Construtor

void execute(){
int y = 0;
for (int z = 0; z < 4; z++){
y+=z+x;
}
}
}

Não me pergunte qual significado desse código que nem eu sei, o que precisamos entender é que podemos destacar algumas variáveis (e, x, x2, x3, y e z) e todas elas possuem escopos:

  • ‘s’ é static, ou seja, possui um longo escopo; elas são criadas quando a classe é carregada, e elas sobrevivem enquanto a classe permanecer carregada na JVM;
  • ‘x’ é uma variável de instância, ou seja, elas são criadas quando uma nova instancia é criada e elas permanecem ainda que a instância seja removida;
  • ‘y’ é uma variável local, ou seja, elas vivem ao longo da execução de um método na stack, contudo podem continuar vivas ainda fora de scopo;
  • ‘z’ é uma variável de bloco, ou seja, permanece somente enquanto o bloco é executado;
  • x2 é uma variável de bloco de inicialização e x3 de construtor, parecidas com variáveis locais.

se você tentar executar o código abaixo provavelmente ocorrerá um erro pois o método main é static, ou seja, foi criado quando a classe foi carregada. Isso significa que a variável de instância x ainda não foi criada, então não pode ser acessada.

public class exemplo{
int x = 10;
public static void main(String args[]){
x++; //Não compila
}
}

se você tentar executar o código abaixo provavelmente ocorrerá um erro pois a variável x foi criada localmente e não pode ser acessada por outr método ainda que esteja trabalhando. Look:


public class exemplo{

public static void  main(String args[]){
exemplo e = new exemplo();
e.execute();
}
void execute(){
int x = 1;
incrementa();
    System.out.println("Value: "+x);
}

void incrementa(){
x++; //Ainda está 'viva', porém fora de escopo
}
}

Usando Variável ou Array não inicializadas ou atribuidas

Em java nós temos a possibilidade de inicializar ou não uma variável, porém quando tentarmos acessar uma variável não inicializada podemos ter um comportamento diferente do esperado. Esse comportamente depende também do tipo (primitivas ou objetos) ou do escopo dessa variável.

  • Primitivos e Objetos como Variáveis de Instância: Variáveis de instância (variáveis membro – class level) são inicializadas com o seu valor default toda vez que uma instância é criada da classe. Observe:
    Tipo Valor padrão
    Objetos de referência null
    byte, short, int e long 0
    float e double 0.0
    boolean false
    char ‘\u0000′
  • Arrays como Variáveis de Instância: Um array é um objeto, logo o seu valor default é null. Mas e se for inicializado? o que acontece com o que contem neste array? Se este array for do tipo de Objeto de referência ele recebe o valor padrão dos objetos de referências (null). Se for um tipo primitivo acontece o mesmo processo.
    public class exemplo{
      static int [] var = new int[100];
      public static void main(String args[]){
        for (int i = 0; i < 100; i++){
          System.out.println("Var["+i+"]: "+var[i]);
        }
      }
    }

    … quando rodar este programa ele irá imprimir os 100 inteiros criados com seus valores default (0).

  • Primitivos e Objetos como Variáveis Locais: Variáveis locais (primitivas ou objetos) devem sempre ser inicializadas (fora de qualquer condicional ou loop) antes de serem usadas, incluindo arrays, caso contrário ocorrerá um erro de compilação. Observe:
    public static void main(String args[]){
      String s;
      System.out.println(s); //Erro de compilação
      if (s == null){ // Mesmo se fizermos isso ocorre erro de compilação nessa linha
        System.out.println("String s is null");
      }
    }

    … o certo seria:

    public static void main(String args[]){
      String s = new String(); // ou
      String s = null; // ou
      String s = "";
      System.out.println(s); //Funciona Corretamente
      if (s == null){ // Funciona Corretamente.
        System.out.println("String s is null");
      }
    }
  • Atribuições entre variáveis de referência: Ocorre da mesma forma como nas variáveis locais, é copiado o padrão de bits a ela associada na outra. Porém quando falamos de ‘copiar’ dizemos que duas variáveis de referências apontam para o mesmo padrão de bits, esse padrão de bits referencia a um objeto específico na heap. Observe:
    public static void main(String[] args) {
    
     Dimension a = new Dimension(10,30);
    
     System.err.println("Valor de a.height = "+a.height);
    
     Dimension b = a;
    
     b.height = 20;
    
     System.err.println("Valor de a.height após alterar b = "+a.height);
    }
    

    … nesse caso as variáveis ‘a’ e ‘b’ contém valores idênticos pois ambos referência o mesmo objeto Dimession na heap. Agora tente fazer isso com o objeto String. Funciona? não… pois a String possui um tratamento diferente (excessão). Isso acontece porque toda vez que você atribui um valor a uma String um novo Objeto String é criado na heap.

Por enquanto ficarei por aqui e até a segunda parte de Atribuições.

Vlw.

Batuque Contagia

•dezembro 5, 2009 • Deixe um comentário

Olá galera, apresento aqui a mais nova empresa! Batuque Tecnologia e Informação.

A Batuque é uma empresa baiana que nasceu com o intuito de trazer o que há de novo no mercado tecnológico, inicialmente com o foco em Marketing Mobile e outras soluções Mobile. Agora contando com um grupo maior iniciamos atividades de Desenvolvimento e de Treinamento.

O objetivo da Batuque é garantir que governo e empresas de todos os setores possam gerir seus negócios de forma eficiente e permitir que estejam em contato direto com seus clientes e parceiros, a qualquer hora e em qualquer lugar.

O que a Batuque oferece?

Batuque – Mobile

A Batuque oferece para você o marketing mobile, mais especificamente o Bluetooth marketing, que oferece conteúdos gratuitos para aparelhos celulares que possuam a tecnologia. Esses conteúdos podem ser áudios, jogos, aplicativos desenvolvidos estrategicamente para a empresa, papeis de parede para o aparelho, cupons descontos, vídeos, tudo isso customizado para empresa contratante.

Batuque – Desenvolvimento

Oferece também desenvolvimento de soluções tanto WEB quanto Desktop nas melhores tecnologias encontradas hoje no mercado. Buscando sempre ser um diferencial, a Batuque consta de profissionais capacitados e soluções inovadoras para serem desenvolvidas.

Batuque – Treinamento

Com o intuito de capacitar os profissionais baianos e oferecer às empresas treinamentos e palestras de qualidade, a Batuque pretende oferecer cursos nas mais diversas tecnologias: Java SE, Java EE, Java ME, Flash, XHTML e CSS, PhotoShop, PHP … Para isso os profissionais da Batuque estão buscando cada vez mais se especializar.

Porque Mobile?

Atualmente a tendência é que os computadores diminuam de tamanho (o que já é realidade). E por que não chamar seu celular de Computador? Hoje ele te oferece uma serie de recursos que numa sociedade dinâmica você tenha tudo que necessite na palma da mão em tempo real.

E foi para trazer soluções como esta que a Batuque nasceu, nosso foco é na mobilidade, pois todos nós vivemos no século do dinamismo e precisamos das informações de maneira eficiente e produtiva.

Mais sobre a Batuque Mobile

O que as empresas ganham sendo parceira da Batuque?

Ganha retorno imediato, campanhas interativas, fidelidade dos clientes, propagação da marca em grande escala, pois o Bluetooth permite que as pessoas repassem a informação para outros aparelhos, campanhas inovadoras e mensuráveis.

Isso não é SPAM?

Não. A Batuque Mobile cuida perfeitamente para que uma ferramenta de alto poder comunicativo não se torne uma praga.
Antes de enviar um conteúdo para o cliente, pergunta se ele deseja receber o conteúdo, caso a resposta for SIM. O cliente recebe o conteúdo e seu aparelho não recebe mais a campanha. caso a resposta for NÃO. o cliente não recebe o conteúdo e seu aparelho não recebe mais a informação.

A Criação das Campanhas?

A Batuque Mobile tem pessoas altamente capacitadas para oferecer soluções inéditas no mercado.

Seja parceira da Batuque Mobile.

Marque uma visita, mande um e-mail, telefone mas não deixe de obter sua solução aqui conosco.

Conheça mais sobre a Batuque acessando Batuque Tecnologias

Contate a Batuque

Acesse nosso Blog

Flávio Ribeiro
(73) 8809-2184
flavio@batuquetecnologias.com.br

Trabalhamos em todo território da Bahia e Sergipe

Certificação SCJP – Orientação a Objetos

•novembro 2, 2009 • 3 Comentários

Dando continuidade ao post anterior (Certificação SCJP – Declarações e Controle de Acesso) depois de muito tempo, irei abordar aqui a segunda parte do estudo sobre a certificação – Orientação a Objetos. Todos os códigos apresentados aqui fazem parte deste post e são totalmente comentados – É importante testá-los.

Objetivos abordados:

1.2 (Já Abordado) Desenvolver código que declare interfaces. Que implemente ou estenda uma ou mais interfaces. Que declare uma classe abstrata e desenvolver código que estenda classes abstratas;

1.3 (Já Abordado) Desenvolver código que declare, inicialize, e use primitivos, arrays, enuns, e objetos como static, instancia e variáveis locais. Também, usar identificadores válidos para nomes de variáveis;

1.5 Dado um exemplo de código, determinar se um método está substituindo ou sobrecarregando outro método corretamente, e identificar valores de retorno legais (incluindo retorno covariante), para o método;

1.6 Dado uma lista de classes e superclasses, desenvolver construtores para uma ou mais classes. Dado uma declaração de classe, determinar se um construtor default será criado, e se sim, determinar o comportamento do mesmo. Dado uma lista de classes aninhadas e não aninhadas, escrever código para instanciar a classe;

5.1 Desenvolver código que implemente encapsulamento rígido, acoplamento, e alta coesão em classes, e descrever os benefícios;

5.2 Dado um cenário, desenvolver código que demonstre o uso de polimorfismo. Além disso, determinar quando “casting” será necessário e reconhecer erros de compilação vs. em tempo de execução relacionados com uso de “casting” para objetos de referência;

5.3 Explicar o efeito de modificadores em herança com relação a construtores, variáveis estáticas ou de instância, e métodos estáticos ou de instancia;

5.4 Dado um cenário, desenvolver código que declare e/ou invoque métodos sobrescritos ou sobrecarregados e código que declare e/ou invoque superclasses, substituídos ou sobrecarregados construtores;

5.5 Desenvolver código que implemente relacionamentos “é um” e/ou “tem um”.

Encapsulamento (Objetivo 5.1)

Utilizando esta técnica, você pode tornar seu código totalmente flexível, de fácil manutenção e extensível. Como fazer isso?

  1. Mantenha suas variáveis de instância protegidas utilizando o modificador de acesso private;
  2. Faça métodos de acesso public para forçar o uso destes métodos em vez de acessos diretos às variáveis;
  3. Use o padrão de desenvolvimento JavaBeans: set<Propriedade> e get<Propriedade>.

Exemplo 1

Herança (Objetivo 5.5)

A primeira coisa que você precisa saber sobre a herança é que toda classe Java herdará a class Object, logo toda classe sempre terá os métodos: equals, clone, notify, wait e outros. Para o exame você precisa saber que para criar relacionamentos de herança você terá que estender uma classe. Objetivos de usar herança?

  1. Promover reuso de código;
  2. Usar polimorfismo.

O objetivo mais comum em projetos é criar classes genéricas para permitir redução de código e a partir desta, e criar classes mais especializadas.

Criando classes genéricas evita perda de tempo ao fazer mudanças em seu código. Imagine que você tivesse 20 classes que implementam um mesmo método ou similar e depois você descobrisse que precisaria mudar alguma coisa. Você iria ter que mudar em suas 20 classes se não criasse uma classe genérica.

Outra coisa importante sobre herança é o conceito de polimorfismo. Imagine uma classe Evento que implementa o método palestras e minicursos, e agora imagine outras duas subclasses dessa classe Evento chamadas: SISB e SISOL com suas propriedades específicas. Essas duas subclasses podem ser tratadas como uma classe Evento, olhe este exemplo e você irá entender:

Exemplo 2

No exemplo anterior você pode perceber o Relacionamento é-um: Este conceito é baseado em herança de classes ou implementação de interfaces.

e um Relacionamento Tem-um: Este relacionamento quer dizer que uma classe possui em seu código uma referencia para outra classe. Por exemplo, uma classe SISB herda (É-um) uma classe Evento, porém SISB possui uma instância (Tem-um) de PublicoAlvo como mostra o exemplo 2 novamente.

Neste exemplo você pode perceber também que:

Evento é superclasse de SISB / SISOL e SISB / SISOL é subclasse de Evento
primeiroSISB é uma variável de referência de tipo SISB.
primeiroSISB como é um tipo SISB ele tem acesso às propriedades específicas de SISB como as propriedades da superclasse de SISB, Evento.

Se eu disser primeiroSISB instanceof Evento isto retornará true como ocorre no exemplo. Se você tentar colocar primeiroSISB instanceof SISOL irá ocorrer um erro de compilação.

Polimorfismo (Objetivo 5.2)

Todos objetos em Java são considerados polimórficos exceto objetos do tipo Object, no sentido de que esses objetos passam no teste é-um em relação ao seu tipo e ao tipo Object (Teste instanceof). Para certificação é importante saber que a única forma de acessar um objeto é através de uma variável de referência (Leia com atenção as regras abaixo):

  1. Uma variável de referencia pode ser apenas de um tipo e depois de declarada nunca poderá ser mudado o seu tipo;
  2. Uma referencia é uma variável podendo ser reatribuída uma vez que não esteja marcada como final. Após ser marcada como final apenas sua referencia pode ser modificada;
  3. O tipo de uma variável de referencia é que determina quais métodos podem ser invocados (Aqui surge o conceito de sobrescrição);
  4. Uma variável de referencia pode referenciar qualquer objeto do mesmo tipo que a referência declarada ou qualquer outro subtipo da referência.

Por exemplo: temos uma classe chamada Evento e outras duas classes estendendo Evento (SISB e SISOL). Podemos criar um Evento da seguinte forma – Evento primeiroSISB = new SISB(); ou então diretamente SISB primeiroSISB = new SISB(); ou também Object primeiroSISB = new SISB();

Para a certificação é importante saber que uma subclasse não pode possuir mais de uma classe “pai”. Caso haja a necessidade de que uma classe herde mais de uma classe o correto a se fazer é implementar interfaces.

Exemplo 3

No exemplo 3 podemos criar algumas declarações válidas:

SISB primeiroSISB = new SISB();

Object o1 = primeiroSISB;

Evento e1 = primeiroSISB;

Maratona m1 = primeiroSISB;

Como podemos perceber existe apenas um objeto aqui, que é a instância do tipo SISBprimeiroSISB – e podemos encontrar 4 tipos de variáveis de referência referenciando apenas um objeto em memória.

Aí surge uma pergunta interessante: Quais métodos primeiroSISB, o1, e1 e m1 podem invocar? primeiroSISB – todos os métodos acessíveis da classe SISB, Object, Evento e Maratona; o1 – apenas os métodos da classe Object; e1 – apenas os métodos da classe Evento e Object; m1 – apenas os métodos da referente a classe Maratona e a Object;

É importante saber que apesar de você acessar os métodos de outra classe esses métodos irão retornar baseando-se no objeto instanciado. Se você sobrescrever o método propriedadeEvento() no primeiroSISB quando você chamar este método (e1.propriedadeEvento()) o mesmo irá retornar o evento sobrescrito;

Sobreposição/Sobrecarga (Objetivos 1.5 e 5.4)

Sobrepor – Override

significa definir um comportamento especifico a uma determinada subclasse, considerando que a superclasse tenha um comportamento pré-definido.
Quando a classe é abstrata, automaticamente você será obrigado a sobrepor os métodos abstratos em uma classe concreta (não abstrata).

Quando uma classe é estendida e seus métodos são marcados como public você está habilitado em modificar o acesso a seus métodos na subclasse. No exame é importante ficar atento às regras de polimorfismo. Abaixo segue algumas regras para sobrescrever um método:

  1. Os argumentos devem ser os mesmos do método sobrescrito, caso contrário você estará sobrecarregando-o;
  2. O retorno deve ser o mesmo ou de um subtipo do tipo de retorno declarado no método original;
  3. O nível de acesso não deve ser mais restritivo do que o do método sobrescrito, pode ser menos restritivo;
  4. Métodos de instância podem ser sobrescritos desde que a classe que o contenha seja herdada, não podendo sobrescrever métodos com modificadores private ou final;
  5. Classes em outro pacote só pode sobrescrever métodos que são marcados com public ou protected e não-estático. O compilador irá permitir, porém avisará que o método não está sendo sobrescrito;
  6. O método sobrescrito pode lançar qualquer exceção não-verificada, mesmo que o método original não tenha declarado a exceção;
  7. O método não deve lançar exceções  verificadas novas ou mais abrangentes do que as já declaradas pelo método sobrescrito;
  8. Não é possível sobrescrever método marcado como final e/ou static;
  9. Se um método não for herdado você não poderá sobrescreve-lo;

Exemplo 4

Você pode invocar o método original da superclasse na subclasse utilizando a palavra-chave super como no exemplo.

OBS.: Se você tiver uma classe A que possui um método getA() que lança a exceção Exception e uma classe B que estenda a classe A e sobrescreva esse método removendo o lançamento da Exceção, um problema pode ocorrer quando utiliza-se polimorfismo. Veja o exemplo:

Exemplo 5

Sobrecarregar – Overload

significa reusar o mesmo nome de um método declarado na classe, porém com diferentes argumentos (Obrigatório) e com retorno diferente (Opcional). Para sobrecarregar métodos:

  1. você DEVE mudar os argumentos;
  2. você PODE mudar o tipo de retorno;
  3. você PODE mudar o modificador de acesso;
  4. você PODE declarar novas ou mais exceções verificadas (O contrário de sobreposição);
  5. você PODE sobrecarrega-lo na mesma classe ou em uma subclasse.

Exemplo 6

A escolha de qual método sobrecarregado usar não é feita em tempo de execução (tempo de compilação) causando alguns efeitos quando falamos de polimorfismo. Por exemplo: imagine que tenhamos duas classes (Evento e SISB) sendo que SISB extends Evento e uma classe C com dois métodos sobrecarregados getVersion(Evento evento) e getVersion(SISB sisb). Seguindo o exemplo abaixo você irá perceber que o método escolhido se baseará no tipo de Referência e não no tipo de Objeto. O tipo de Objeto você define quando coloca new … e o tipo de referência quando você coloca Evento e. Observe o exemplo:

Exemplo 7

É importante saber que se o método for sobreposto a escolha de qual método usar será feita diferentemente de métodos sobrecarregados, será feita em tempo de execução, ou seja, se baseará no tipo do Objeto e não no tipo de Referência.

“Casting” a variáveis de referência (Objetivo 5.2)

Casting significa converter um objeto a um tipo definido. Nada melhor do que um exemplo para entendermos como funciona. Vamos supor que eu tenha uma classe Evento e uma classe SISB que estenda a classe Evento (SISB é-um evento). Evento tem o método getEvento() e a classe SISB tem os métodos getSISB e getEvento (Sobreposto) – Veja o Exemplo 8. Se você criar:

Evento e1 = new Evento(); // TERÁ APENAS ACESSO AOS MÉTODOS DE EVENTO

SISB primeiroSISB = new SISB(); // TERÁ ACESSO AOS MÉTODOS DE EVENTO E SISB

Evento eventoSISB = new SISB(); // TERÁ APENAS ACESSO AOS MÉTODOS DE EVENTO

Agora suponha que eu queira acessar o método getSISB do Objeto eventoSISB, como eu faria isso? Utilizando casting da seguinte forma:

SISB sisb = (SISB)eventoSISB;

Após isso nós teremos acesso ao método getSISB!

Exemplo 8

Nós tempos dois tipos de CAST: explicito e implicito

SISB primeiroSISB = new SISB();

Explícito: Evento e1 = (Evento)primeiroSISB;
Implícito: Evento e2 = primeiroSISB;

Implementando uma Interface (Objetivo 1.2)

Como já foi no post anterior, interfaces é um tipo de classe totalmente abstrata. Logo, se você implementa uma interface isto quer dizer que você está aceitando um contrato, ou seja, você será obrigado a implementar todos os métodos que nela existir. Segue algumas regras válidas para implementações:

  1. Implementar todos os métodos declarados na interface;
  2. Seguir todas as regras para sobreposições (overrides) validas
  3. Declarar exceções não verificadas na implementação dos métodos diferentes das declarada pelo método na interface;
  4. Manter o nome do método declarado na interface como também o tipo de retorno (podendo ser um subtipo – Polimorfismo), não precisando declarar a exceção já declarada na interface pelo método.

É importante salientar que a implementação desses métodos só podem ser feitas em classes concretas ou não abstratas. Por exemplo: Temas uma interface Maratona (com os métodos m1 e m2) e uma classe abstrata Evento. Evento implementa Maratona, isso significa que Evento não será obrigada a implementar os métodos na interface Maratona.

Exemplo 9

Uma classe pode implementar mais de uma interface (classes não podem estender mais de uma classe). E referente a interface, não pode implementar nada e somente estender interfaces (podendo estender mais de uma interface).

Tipos de retornos válidos (Objetivo 1.5)

Para a certificação dois aspectos são necessários observar: o que podemos declarar como um tipo de retorno e o que podemos retornar como um valor. Para o primeiro aspecto é simples, porém o que complica mesmo é quando falamos herança -  se você está sobrepondo um método herdado ou criando um novo (inclui-se aqui métodos sobrecarregados).

Tipo de retorno para Métodos Sobrecarregados:

Quando falamos de sobrecarregamento (já explicado antes), queremos dizer que mesmo que este método seja herdado você está apenas aproveitando o nome dele podendo assim ser considerado praticamente como um novo método. Com isso podemos escolher qualquer tipo de retorno que quisermos mudando apenas a lista de argumentos.

Tipo de retorno para Métodos Sobrepostos:

Quando falamos de sobreposição (também já explicado antes), queremos dizer que queremos mudar a implementação de um método herdado (override), porém nesse caso o método modificado deve ser declarada exatamente igual ao método da superclasse. Como mudar então o tipo de retorno? provavelmente você deve lembrar de polimorfismo! O Java 5, permitiu que você pudesse mudar o tipo de retorno de um método sobreposto para um subtipo deste tipo.

Exemplo 10

Se você tentar compilar este código no Java 1.4 ocorrerá o seguinte erro: attempting to use incompatible return type.

Retornando um valor
  1. Você pode retornar null em um método com um tipo de retorno de referência a objeto
  2. public Button getButton(){
    return null;
    }
  3. Arrays são tipos de retornos legais
  4. public String[] getNomes(){
    return new String[] {"Flávio", "Lara", "Amanda"};
    }
  5. Método com tipo de retorno primitivo pode retornar qualquer valor que pode ser implicitamente convertido ao tipo de retorno declarado
  6. public int getChars(){
    char c = 'c';
    return c; // Compatível com int
    }
  7. Método com tipo de retorno primitivo pode retornar qualquer valor que pode ser explicitamente convertido ao tipo de retorno declarado
  8. public int getValue(){
    float c = 50.5f;
    return (int)c; // Casting
    }
  9. Você não pode retornar nada em um método com tipo de retorno void
  10. public void values(){
    return "Teste"; // Inválido
    }
  11. Um método com tipo de retorno uma referência a um objeto você pode retornar qualquer tipo de objeto que pode ser implicitamente convertido (SUBTIPO)
  12. public Animal getAnimal(){
    return new Gato();
    }

Construtores e instanciações (Objetivos 1.6, 5.3 e 5.4)

Quando você cria um objeto isto é feito por intermédio do construtor. Os construtores são iniciados quando você utiliza em seu código a palavra-chave new. Todas as classes, incluindo as abstratas, devem ter um construtor, porém isso não significa que você precisa declara-lo. Construtores não possuem tipo de retorno e obrigatoriamente devem ter o nome exatamente igual o da classe.

public class Evento{
// Construtor
Evento(){
}
}

Geralmente os construtores são utilizados para inicializar variáveis de instância, como abaixo:

public class SISB{
Date data;
String tema;
Evento(Date data, String tema){
this.data = data;
this.tema = tema;
}
}

A palavra-chave this é utilizada para referenciar o objeto implícito na chamada a um método de instância, ou seja, utilizada para referenciar (representar) um objeto em execução.

Vamos supor que exista uma classe SISB e uma classe Evento, e SISB estende Evento. O que acontece quando eu declaro isto em meu código?

SISB primeiroSISB = new SISB();
  1. O Construtor da classe SISB é invocado. Todo construtor invoca o construtor da sua superclasse através de uma chamada implícita do método super() exceto um construtor invocando um construtor sobrecarregado da mesma classe.
  2. O Construtor da classe Evento é invocado.
  3. O Construtor da classe Object é invocado.
  4. Todas as variáveis de instancia da classe Object são inicializadas, ou seja, são dados os seus respectivos valores. Como por exemplo, se você declarar int x = 25; assim que o construtor é chamado essa variável é inicializada com o valor 25, caso o construtor não seja chamado esta variável será nula.
  5. Construtor da classe Object está completo!
  6. Todas as variáveis da classe Evento são inicializadas (se tiver).
  7. Construtor da classe Evento está completo!
  8. Todas as viriáveis da classe SISB são inicializadas.
  9. Construtor da classe SISB está completo!

Regras para construtores:

  1. Construtores podem usar qualquer modificador de acesso, incluindo private. Construtores com modificador de acesso privado significa que está classe não poderá ser instanciada diretamente. Você pode criar um método que retorne esta classe instanciada;
  2. O nome do construtor deve ser exatamente igual ao nome da classe;
  3. Construtores não possuem tipos de retorno;
  4. Você pode possuir um método com o mesmo nome da classe porém esteja claro que isto não será um construtor;
  5. Se você não declarar um construtor para sua classe, automaticamente o compilador gerará um construtor default;
  6. O construtor default não possui argumentos;
  7. Fique atento ao item 5, pois se você declarar um construtor com uma lista de argumentos e não declarar o construtor default o compilador não criará o construtor default, pois ele irá supor que você não precisará deste;
  8. Todo construtor terá uma chamada para um construtor sobrecarregado (this()) ou uma chamada para o construtor de sua superclasse (super());
  9. Se você digitar o construtor (caso não confia no compilador), e não digitar uma chamada para super() ou para this(), o compilador irá automaticamente inserir uma chamada sem argumentos para super();
  10. Uma chamada para super() pode ser feita através de uma chamada sem argumentos como também como argumentos;
  11. Um construtor sem argumentos não será necessariamente um construtor default, pois você pode modifica-lo;
  12. Você não pode acessar um método ou uma variável de instância sem que o construtor tenha iniciado;
  13. Somente métodos e variáveis estáticas podem ser acessados a parte da chamada do super() ou do this();
  14. Classes abstratas tem construtores, e o construtor dela sempre é chamado quando uma subclasse concreta é instanciada;
  15. Interfaces não possuem construtores;
  16. Um construtor só pode ser invocando dentro de outro construtor. Você não pode fazer como no exemplo:
  17. public class SISB{
    
    void getTipo(){
    
    SISB(); // ESTÁ CHAMADA É ILEGAL
    
    }
    
    }

Quando você declarar um construtor é importante colocar antes de qualquer linha de código uma chamada para super() ou para this().

Statics (Objetivo 1.3)

Para entendermos como usar o modificador Static para métodos ou variáveis precisamos entender porque usar! Quando falamos de métodos ou variáveis estáticas queremos dizer que possuem um comportamento que nunca se modificará. Podemos citar como exemplo o caso da classe Math quem possui um método estático que gera numeros randomicos: Math.radom(); Este comportamento nunca se modificará e para utilizar esta funcionalidade não precisamos criar uma instância dessa classe basta apenas chama-la. Outro exemplo clássico é da classe JOptionPane que possui o método JOptionPane.showMessageDialog(…); como muitos outros métodos. Para chamar estes métodos e variáveis não precisamos instanciar estas classes. Olhe o Exemplo:

JOptionPane.showMessageDialog(
frame, // nome do component
"Tem certeza?", // mensagem
"Confirmação", // titulo
JOptionPane.YES_NO_OPTION, // VARIÁVEL STATIC DA CLASSE JOPTIONPANE
JOptionPane.QUESTION_MESSAGE, // VARIÁVEL STATIC DA CLASSE JOPTIONPANE
null, null, null
);

Observe o exemplo abaixo

Exemplo 11

Como nesse exemplo, você pode perceber que a variável contador é criada antes que se crie uma instância da classe Exemplo11.

Se você remover a declaração static da variável irá ocorrer um erro de compilação no método main(). Isto ocorre porque o método é estático e não pode acessar uma variável não estática fora do seu contexto. Para acessar a variável você precisaria criar uma instancia de Exemplo11 (Exemplo11 exemplo = new Exemplo11()) e pegar o valor dessa variável (exemplo.contador).

A regra para métodos estáticos é que so podem acessar métodos e variáveis estáticas. E variáveis estáticas pode ser acessadas da seguinte forma: Exemplo11.contador (não precisa criar uma instância – new Exemplo11()).

Hibernate – Saíba como utilizar! [Dicas e Truques] – Parte 2

•outubro 3, 2009 • 3 Comentários

hibernate

Olá pessoal. Como foi apresentado em um post anterior, já sabemos agora como configurar um projeto para que o mesmo esteja apto a utilizar as funcionalidades do hibernate utilizando o NetBeans. Iremos neste post fazer alguns exemplos de utilização do hibernate para consultas, inserção, deleção e atualização em um banco de dados. E pretendo na Parte 3 desta sequência utilizar o hibernate para implementação Web.

Baixem os códigos fontes caso haja dificuldade, porém recomendo acompanhar os passos para se familiarizar:
getJavaUsuario();
getJavaProduto();
getJavaVenda();
getJavaVendasItens();

Posts Anteriores

  1. Hibernate – Saíba como utilizar! [Dicas e Truques] – Parte 1

Índice:

  1. Criando o Banco de Dados;
  2. Criando a Classe Usuario;
  3. Criando a Classe Produto;
  4. Criando a Classe Venda;
  5. Criando a Classe Venda_Itens;
  6. Exemplos de Inserção/Atualização/Deleção/Consulta;

1. Criando o Banco de Dados

Antes de mais nada precisaremos criar um banco de dados. Vale lembrar que mesmo que eu esteja usando o PostgreSQL você pode utilizar qualquer um. Segue a estrutura do nosso banco de dados:

Tabela Usuário: ID e Nome;

Tabela Produto: ID, Nome, Usuário e Estoque;

Tabela Vendas: ID, Data e Vendedor (Usuário);

Tabela Venda_Itens: ID, Venda, Produto e Quantidade;

Baixe aqui o script.

Antes de começarmos a implementar nossas classes a serem mapeadas precisamos entender como se dá os relacionamentos entre as tabelas. Para isso recomendo que você faça uma modelagem do seu banco de dados (Diagrama de Classes) representando esses relacionamentos. Como esse banco de dados é simples irei mostrar basicamente como funciona:

Relação Produto x Usuário

Usuário – Um para N – Produto

Produto – Um para Um – Usuário

Relação Usuário x Vendas

Usuário – Um para N – Vendas

Vendas – Um para Um – Usuário

Relação Venda_Itens x Vendas

Venda_Itens – Um para Um – Vendas

Vendas – Um para N – Venda_Itens

Relação Venda_Itens x Produto

Venda_Itens – Um para Um – Produto

Produto – Um para N – Venda_Itens

2. Criando a Classe Usuario

Iremos criar o esqueleto da classe e depois iremos fazer a ligação com hibernate! Antes de mais nada todos os nossos beans irão implementar java.io.Serializable para podermos utilizá-las como parâmetro ou como retorno de chamadas remotas!

Primeiramente precisamos criar os mesmos campos que colocamos no banco de dados: id e nome;

Precisamos também criar os métodos getters e setters, um construtor padrão e um construtor com os parâmetros id e nome. Feito isso vamos configurar o hibernate:

Imediatamente antes da declaração da classe precisamos colocar 2 annotations (responsável pela associação de classes java com o banco de dados):
@Entity
@Table(name = “usuario”) // DEFINO O NOME DA TABELA O QUAL A CLASSE ESTÁ ASSOCIADA

Imports necessários: javax.persistence.Entity; e javax.persistence.Table;

Imediatamente antes da declaração do campo id iremos colocar:
@Id // DEFINO QUE ELE É O CAMPO PRIMARYKEY
@Column(name = “id”) // ASSOCIO A UMA COLUNA DO BANCO DE DADOS – NECESSÁRIO SE O NOME DO CAMPO FOR DIFERENTE DO DECLARADO NA CLASSE

imports necessários: javax.persistence.Column;

e faremos o mesmo para nome: @Column(name = “nome”).

Pronto nossa classe está inicialmente preparada. Posteriormente quando entramos na classe produto veremos que precisaremos voltar nela e adicionar algumas particularidades, porém da forma como ela está feita podemos manipular o banco de dados facilmente.

3. Criando a Classe Produto

Da mesma forma como foi feito com usuário iremos fazer aqui, porém como produto possui no banco de dados o id do usuário (usuario) precisamos dizer que em vez de trazer o id que tal trazer o usuário. Então vamos lá:

como foi dito antes, um produto pode ser apenas cadastrado por um usuario logo o relacionamento é um para um, ficando na classe desta forma:

@OneToOne (fetch=FetchType.LAZY) // ESSE fetch DECLARADO COMO LAZY QUER DIZER QUE ELE IRÁ TRAZER O USUÁRIO APENAS QUANDO SOLICITADO PRA NÃO CRIAR CARGA NO NOSSO SISTEMA.
@JoinColumn(name=”usuario”) // NOME DA COLUNA QUE REFERENCIA O ID DO USUARIO

imports necessários: javax.persistence.OneToOne; javax.persistence.FetchType; javax.persistence.JoinColumn;

Como já fizemos o relacionamento de Produto com Usuario vamos fazer o inverso agora. Sabemos que um usuário pode cadastrar vários produtos e esse é um relacionamento um para muitos. Iremos criar um List<Produto> produtos; na classe Usuario e antes dele iremos adicionar os annotations:

@OneToMany(mappedBy=”usuario”, fetch=FetchType.LAZY) // PRECISAMOS INFORMAR QUE ELE SERÁ MAPEADO PELO ATRIBUTO QUE ESTÁ NA CLASSE PRODUTO QUANDO DECLARAMOS: private Usuario usuario;

imports necessários: javax.persistence.OneToMany;

Crie o get e o set desta nova variável.

4. Criando a Classe Venda

Da mesma forma como foi feita com as outras classes é necessário criar os campos: id, data e vendedor (que será um tipo Usuario)

No campo data é preciso colocar a seguinte annotation:
@Temporal(TemporalType.DATE)

imports necessários: javax.persistence.TemporalType; e javax.persistence.Temporal;

Antes do atributo vendedor iremos adicionar os annotations:
@OneToOne(fetch=FetchType.LAZY) // RELACIONAMENTO AINDA UM PARA UM
@JoinColumn (name = “vendedor”) // CAMPO QUE REFERENCIA O ID DO USUARIO

só é criar os métodos getters e setters.

Da mesma forma como fizemos com produto iremos criar um List<Venda> vendas; na classe usuario e colocar o seguinte annotation:

@OneToMany(mappedBy=”vendedor”, fetch=FetchType.LAZY) // PRECISAMOS INFORMAR QUE ELE SERÁ MAPEADO PELO ATRIBUTO QUE ESTÁ NA CLASSE VENDA QUANDO DECLARAMOS: private Usuario vendedor;

crie o get e set dessa nova variável;

5. Criando a Classe Venda_Itens

Crie os atributos e coloque os anottations da mesma forma como foi feito anteriormente só que com uma diferença. Como declaramos antes muitos VendasItens irá conter um produto e uma venda. Isso será um relacionamento muitos para um e iremos fazer da seguinte forma:

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name=”venda”)
private Venda venda;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name=”produto”)
private Produto produto;

Agora podemos perceber que na classe Venda precisamos adicionar uma Lista de VendasItens e a classe produto da mesma forma: (Fazemos isso porque futuramente pode surgir a necessidade de querermos saber em quais vendas tal produto está incluso)
Para a classe Venda:
@OneToMany(mappedBy=”venda”, fetch=FetchType.LAZY)
private List<VendasItens> vendasItens;

Para classe Produto:
@OneToMany(mappedBy=”produto”, fetch=FetchType.LAZY)
private List<VendasItens> vendasItens;

Crie os getters e setters e finalize todas as classes. Verifique em todas as classes se os métodos getters e setters foram criados e se todos os relacionamentos foram feitos.

6. Exemplos de Inserção/Atualização/Deleção/Consulta

No primeiro post eu criei uma classe Main com toda configuração do pool de conexões do hibernate (getJavaMain();). Logo após session.beginTransaction(); é que irá entrar todos os nossos códigos. A session criada irá conter os métodos necessarios são eles:

session.save(<Classe>); //SALVA
session.update(<Classe>); //ATUALIZA
session.saveOrUpdate(<Classe>); //SALVA E ATUALIZA (A PRÓPRIA SESSION IDENTIFICA ISSO)
session.delete(<Classe>); //DELETA
session.get(<Classe>, <ID>); //CONSULTA

Cadastro:

Vamos inserir primeiramente 3 Usuários:

Usuario usuario1 = new Usuario(1, “Flávio”); //SE VOCÊ COLOCOU ID COMO AUTOMATICO BASTA VOCÊ SUBSTITUIR POR 0 E ELE IRÁ COLOCAR UM ID.
Usuario usuario2 = new Usuario(2, “Lara”);
Usuario usuario3 = new Usuario(3, “Amanda”);

session.save(usuario1);
session.save(usuario2);
session.save(usuario3);

Execute e como nós colocamos pra mostrar as consultas ele irá exibir 3x:
Hibernate:
insert
into
usuario
(nome, id)
values
(?, ?)

Cadastro:

Vamos inserir 4 produtos agora, para isso precisamos para cada produto 1 usuário:

Usuario usuario = (Usuario)session.get(Usuario.class, 1); // IRÁ RETORNAR O USUARIO FLÁVIO

Produto produto1 = new Produto(1, “Teclado”, usuario, 10);
Produto produto2 = new Produto(2, “Mouse”, usuario, 25);

usuario = (Usuario)session.get(Usuario.class, 2); // IRÁ RETORNAR O USUARIO LARA
Produto produto3 = new Produto(3, “Notebook”, usuario, 5);

usuario = (Usuario)session.get(Usuario.class, 3); // IRÁ RETORNAR O USUARIO AMANDA
Produto produto4 = new Produto(4, “Monitor”, usuario, 32);

Consulta:

Agora eu quero saber quantos produtos o Usuario Flávio cadastrou:

Usuario usuario = (Usuario)session.get(Usuario.class, 1);

JOptionPane.showMessageDialog(null, usuario.getProdutos().size()); // IRÁ IMPRIMIR 2 – SE QUIZESSE SABER O NOME É SÓ CRIAR UM FOR ;]

Cadastrar vendas:

1ª venda: Feita pelo vendedor Flávio e vendeu 3 Teclados e 1 monitor
2ª venda: Feita pela vendedora Lara e vendeu 1 notebook e 5 mouses
3ª venda: Feita pela vendedora Amanda e vendeu 4 monitores e 5 Teclados

1ª Venda:
//PEGA O USUARIO QUE IRÁ EFETUAR A VENDA
Usuario usuario = (Usuario)session.get(Usuario.class, 1);
//CRIA A VENDA
Venda venda = new Venda(1, new Date(), usuario);
//CRIA UMA LISTA DE VENDASITENS PARA UMA VENDA
ArrayList<VendasItens> vendasItens = new ArrayList<VendasItens>();
//PEGA O PRIMEIRO PRODUTO A SER INSERIDO
Produto produto = (Produto)session.get(Produto.class, 1);
//ADICIONA NO VENDASITENS PASSANDO QUAL A VENDA, QUAL PRODUTO E QUAL A QUANTIDADE
vendasItens.add(new VendasItens(1, venda, produto, 3));
//PEGA O PRÓXIMO PRODUTO
produto = (Produto)session.get(Produto.class, 4);
//ADICIONA NO VENDASITENS
vendasItens.add(new VendasItens(2, venda, produto, 1));
//SALVA A VENDA
session.save(venda);
//E PRA CADA ITENS DA VENDA – SALVA
for (VendasItens vItens : vendasItens) {

session.save(vItens);

}

2ª Venda e 3ª Venda seguem a mesma logica.

Exclusão:

Para excluir é simples, basta você fazer a consulta e passar por parâmetro da seguinte forma:

Usuario usuario = (Usuario)session.get(Usuario.class, 1);

session.delete(usuario);

Atualização:

Para atualizar é muito mais simples ainda:

Usuario usuario = (Usuario)session.get(Usuario.class, 1);

usuario.setNome(“Flávio Augusto Ribeiro Moura”);

session.update(usuario); //ESSA CHAMADA NÃO É NECESSÁRIA POIS O HIBERNATE IDENTIFICA SUA ATUALIZAÇÃO NO MOMENTO DO setNome E QUANDO CHEGA NO COMMIT ELE ATUALIZA

Vamos ver se deu tudo certo (Vocês verão como parece MÁGICA)

Consulta:

Quero saber quais vendas o produto Teclado está, qual a quantidade vendida na venda e quem vendeu. se fosse fazer no select sairia um pouco complicado e grande a consulta. Com apenas 3 linha de código eu descubro tudo isso:

Produto produto = (Produto)session.get(Produto.class, 1); // PEGO O PRODUTO QUE PRECISO

for (VendasItens vItens : produto.getVendasItens()) { // PARA CADA VENDASITENS DO PRODUTO

JOptionPane.showMessageDialog(null,
“Codigo da Venda: “+vItens.getVenda().getId()+ // AQUI ELE FAZ UM SELECT EM VENDA PRA SABER OS DADOS
“\nData da Venda: “+vItens.getVenda().getData()+ // AQUI ELE FAZ UM SELECT EM VENDA PRA SABER OS DADOS
“\nQuantidade:”+vItens.getQuantidade()+ // PEGA A QUANTIDADE
“\nQuem Vendeu? “+vItens.getVenda().getVendedor().getNome()); // AQUI ELE FAZ UM SELECT EM VENDA E UM SELECT EM USUARIO PARA SABER O SEU NOME

}

Perfeito não? É isso ai galera… Usem a criatividade e pratiquem muito para se familiarizarem. No próximo post vou mostrar mais DICAS e TRUQUES sobre Hibernate com foco principal WEB. Vamos criar uma Classe Genérica para facilitar mais ainda nossas Transações com o banco de dados. Faremos também consultas utilizando HQL (Hibernate Query Language). Tenho certeza que irão gostar! xD

Fonte: Diego CarmoDevMedia

Até o Próximo

I SISB – Semana de Informática do Sudoeste da Bahia

•setembro 28, 2009 • Deixe um comentário

logo_sisb

A I SISB ocorrerá entre os dias 26 e 30 de Outubro de 2009 na cidade de Jequié – Bahia e será organizada pela UESB (Universidade do Sudoeste da Bahia) e FTC (Faculdade de Tecnologia e Ciência). O foco desta semana visa abranger o pessoal voltado a todos os processos que envolvem soluções na área de TI (desenvolvimento, processos, modelagem, redes de computadores, banco de dados). Teremos ótimas palestras e mini-cursos. Não percam!

Programação Confirmada:

Palestras

  1. Gerenciamento Remoto de Casas Inteligentes através de Dispositivos Móveis – Ramon Fontes
  2. Data Mining – Helio Lopes
  3. Sistemas de Apoio à Decisão – José Craveiro da Costa Neto
  4. Grupo Java Bahia e Framework Demoiselle – Serge Rehem
  5. Jovens Empreendedores – Rosival Fagundes
  6. Processamento Digital de Imagens (Métodos e Aplicações) – Joanito de Andrade
  7. Computação Forense – Saulo Correa Peixoto
  8. Arquitetura Orientada a Serviços (SOA) – Camilo Lopes
  9. Mainframe (Ferramentas e Oportunidades de especializações) – Jair Noronha

Minicursos

  1. Introdução a Redes e Configurações Básicas de Roteadores Cisco – Ramon Fontes (8 horas)
  2. Instalação e Configuração de Servidores Lamp – Tiago Pirola (8 horas)
  3. Framework Demoiselle – Robson Saraiva Ximenes (8 horas)
  4. Desenvolvimento de Animações em Flash – Mateus Silva Brito (8 horas)
  5. Introdução ao PHP – Paulo Barros (8 horas)
  6. Introdução ao Linux – Lucas Oliveira Monteiro (8 horas)
  7. Desenvolvimento de Páginas Web Estáticas Vinicius Santos Souza/ Alan Andrade (8 horas)

Entre em contato conosco para mais informações. Confira a Grade Completa do Evento e se programe!

E-Mail do Evento:

Email SISB

Numero para Contato:

NPDI: (73)3528-9737 (Flávio, Murilo, Thamires ou Robson);

Meu Telefone: (73)8809-2184.

Site:

SISB – Site

Aguardem mais informações!

Inscrições a partir do dia 30/09/09!
 
Seguir

Obtenha todo post novo entregue na sua caixa de entrada.