DepartamentoProdutoBean novo arquivo

0:00 / 0:00

O Bean é a classe de dados que representa um único registro da tabela departamento.produto. Ele define os campos, os tipos e a chave primária — é a estrutura que o DAO, o formulário e a listagem usam para ler, gravar e exibir os dados. Primeiro arquivo a ser criado no CRUD — todos os outros dependem dele.

CÓDIGO COMPLETO
package br.xt.app.departamento.produto;

import br.jasap.dao.DBInfo;
import java.io.Serializable;

public class DepartamentoProdutoBean implements Serializable {

    public static String TABLE = "departamento.produto";

    private Integer id_produto;
    private String  nome_produto;
    private Double  vl_produto;
    private Integer qtd_produto;
    private String  obs_produto;

    @DBInfo(serial=true, pk=true)
    public Integer getId_produto() { return id_produto; }
    public void setId_produto(Integer id_produto) { this.id_produto = id_produto; }

    public String getNome_produto() { return nome_produto; }
    public void setNome_produto(String nome_produto) { this.nome_produto = nome_produto; }

    public Double getVl_produto() { return vl_produto; }
    public void setVl_produto(Double vl_produto) { this.vl_produto = vl_produto; }

    public Integer getQtd_produto() { return qtd_produto; }
    public void setQtd_produto(Integer qtd_produto) { this.qtd_produto = qtd_produto; }

    public String getObs_produto() { return obs_produto; }
    public void setObs_produto(String obs_produto) { this.obs_produto = obs_produto; }

    public static String ID_PRODUTO   = "id_produto";
    public static String NOME_PRODUTO = "nome_produto";
    public static String VL_PRODUTO   = "vl_produto";
    public static String QTD_PRODUTO  = "qtd_produto";
    public static String OBS_PRODUTO  = "obs_produto";

}
O que é um Bean?

Bean é uma classe Java simples (POJO — Plain Old Java Object) que só carrega dados. Sem lógica de negócio, sem SQL, sem tela — só campos privados com getters e setters.

No padrão do projeto, cada entidade do banco tem um Bean que:

  • Define os campos que correspondem às colunas da tabela
  • Define a constante TABLE com o nome da tabela
  • Define as constantes de campo com os nomes das colunas
  • Marca a chave primária com @DBInfo
Por que Integer e não int? (tipos wrapper vs primitivo)

Todos os campos usam tipos wrapper (Integer, Double) em vez de tipos primitivos (int, double). O motivo: o banco de dados pode retornar null.

PrimitivoWrapperAceita null?Valor padrão
intIntegerint: não / Integer: simint: 0 / Integer: null
doubleDoubledouble: não / Double: simdouble: 0.0 / Double: null

Se o bean usasse int e o banco retornasse null:

  • O valor viraria 0 silenciosamente — sem como distinguir "zero real" de "campo vazio"
  • Pior: o Jasap usa reflection (populateBean) pra preencher os campos, e tentar colocar null num int causa NullPointerException em runtime

String já é objeto por natureza — aceita null sem precisar de wrapper.

O que é Serializable?

Serializar = converter um objeto Java em bytes (empacotar). Deserializar = converter de volta (desempacotar).

O Jasap guarda o bean na sessão HTTP entre requisições. O Tomcat pode precisar empacotar a sessão a qualquer momento (restart, timeout, cluster). Se o objeto não implementar Serializable, o Tomcat lança NotSerializableException em runtime.

Serializable é uma interface marcadora — não tem nenhum método pra implementar. É só uma "etiqueta" dizendo: "esse objeto pode ser convertido em bytes". Quem faz a conversão é o Tomcat, não o programador.

O que faz o "this" no setter?

this referencia o objeto atual. No setter, diferencia o campo da classe do parâmetro do método:

public void setId_produto(Integer id_produto) {
    this.id_produto = id_produto;
//  ↑ campo       ↑ parâmetro
//  da classe     do método
}

Sem o this, seria id_produto = id_produto — o Java atribuiria o parâmetro a ele mesmo, sem efeito nenhum.

Se os nomes fossem diferentes, o this não seria necessário:

public void setId_produto(Integer valor) {
    id_produto = valor;  // sem conflito de nome
}

Mas por convenção o nome é igual, então o this é obrigatório.

public class DepartamentoProdutoBean implements Serializable

ElementoO que significa
publicA classe é visível para todo o projeto — o DAO, o formulário e a listagem precisam instanciá-la diretamente
classDeclara que isso é uma classe Java — o bloco que agrupa os dados de um produto
DepartamentoProdutoBeanNome da classe. Convenção do projeto: prefixo do módulo + entidade + Bean
implements SerializablePermite que o objeto seja armazenado na sessão HTTP. O Jasap guarda o bean na sessão entre requisições — sem Serializable isso causaria um erro em runtime ao tentar persistir o estado

public static String TABLE = "departamento.produto"

ElementoO que significa
publicO DAO e outras classes precisam ler essa constante diretamente via DepartamentoProdutoBean.TABLE
staticPertence à classe, não a uma instância — permite usar DepartamentoProdutoBean.TABLE sem criar um new DepartamentoProdutoBean()
StringTipo da constante — é um texto com o nome da tabela
TABLENome da constante. Convenção do projeto: maiúsculas, sempre chamado TABLE em todos os beans
"departamento.produto"Schema + tabela no PostgreSQL. O schema departamento agrupa as tabelas deste domínio. O DAO passa essa constante para insert(), update() e delete()

private Integer id_produto / private String nome_produto / ...

Cada campo privado representa uma coluna da tabela. O Jasap usa os nomes dos getters (via reflection) para mapear automaticamente os valores do ResultSet para o bean em query.populateBean(bean) — por isso o nome do getter/setter deve bater exatamente com o nome da coluna no banco.

CampoTipo JavaColuna no bancoO que armazena
id_produtoIntegerid_produtoChave primária gerada pelo banco (serial). Integer e não int porque pode ser null antes do INSERT
nome_produtoStringnome_produtoNome do produto — campo obrigatório validado no formulário
vl_produtoDoublevl_produtoValor numérico com casas decimais — mapeado para numeric no PostgreSQL
qtd_produtoIntegerqtd_produtoQuantidade inteira
obs_produtoStringobs_produtoObservação livre — campo de texto longo

@DBInfo(serial=true, pk=true)

Anotação do Jasap que configura o comportamento do campo no banco de dados. Fica no getter, não no campo.

AtributoO que faz
serial=trueIndica que o banco gera o valor automaticamente no INSERT via sequence. O DAO omite esse campo no SQL de INSERT — se fosse enviado, causaria conflito com o DEFAULT nextval() do PostgreSQL
pk=trueIdentifica este campo como chave primária. O DAO usa esse campo no WHERE do UPDATE e do DELETE — sem isso o framework não saberia qual registro atualizar

public Integer getId_produto() / public void setId_produto(Integer id_produto)

Padrão JavaBeans: getter lê o valor, setter grava. O Jasap usa reflection em populateBean(bean) para encontrar o setter pelo nome da coluna (id_produtosetId_produto). Se o nome não bater, o campo fica null.

ElementoO que faz
getId_produto()Retorna o valor de id_produto. A anotação @DBInfo fica aqui porque o Jasap lê anotações via reflection nos getters
setId_produto(Integer id_produto)Atribui o valor. this.id_produto = id_produto diferencia o campo da classe (this) do parâmetro do método

public static String ID_PRODUTO = "id_produto"

Constantes que referenciam o nome das colunas no banco. Usadas no DAO ao construir SQLs e na listagem pro ORDER BY — evitam strings literais espalhadas pelo código. Se errar o nome da constante, o compilador avisa; se errar uma string literal, só descobre em runtime.

ConstanteValorOnde é usada
ID_PRODUTO"id_produto"DAO: WHERE do daoSingle, daoUpdate, daoDelete
NOME_PRODUTO"nome_produto"DAO: ORDER BY padrão da listagem; List: coluna ordenável
VL_PRODUTO"vl_produto"List: coluna ordenável; disponível para filtros futuros
QTD_PRODUTO"qtd_produto"List: coluna ordenável
OBS_PRODUTO"obs_produto"List: coluna de exibição