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.
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";
}
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:
@DBInfoTodos os campos usam tipos wrapper (Integer, Double) em vez de tipos primitivos (int, double). O motivo: o banco de dados pode retornar null.
| Primitivo | Wrapper | Aceita null? | Valor padrão |
|---|---|---|---|
int | Integer | int: não / Integer: sim | int: 0 / Integer: null |
double | Double | double: não / Double: sim | double: 0.0 / Double: null |
Se o bean usasse int e o banco retornasse null:
0 silenciosamente — sem como distinguir "zero real" de "campo vazio"populateBean) pra preencher os campos, e tentar colocar null num int causa NullPointerException em runtimeString já é objeto por natureza — aceita null sem precisar de wrapper.
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.
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| Elemento | O que significa |
|---|---|
public | A classe é visível para todo o projeto — o DAO, o formulário e a listagem precisam instanciá-la diretamente |
class | Declara que isso é uma classe Java — o bloco que agrupa os dados de um produto |
DepartamentoProdutoBean | Nome da classe. Convenção do projeto: prefixo do módulo + entidade + Bean |
implements Serializable | Permite 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"| Elemento | O que significa |
|---|---|
public | O DAO e outras classes precisam ler essa constante diretamente via DepartamentoProdutoBean.TABLE |
static | Pertence à classe, não a uma instância — permite usar DepartamentoProdutoBean.TABLE sem criar um new DepartamentoProdutoBean() |
String | Tipo da constante — é um texto com o nome da tabela |
TABLE | Nome 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.
| Campo | Tipo Java | Coluna no banco | O que armazena |
|---|---|---|---|
id_produto | Integer | id_produto | Chave primária gerada pelo banco (serial). Integer e não int porque pode ser null antes do INSERT |
nome_produto | String | nome_produto | Nome do produto — campo obrigatório validado no formulário |
vl_produto | Double | vl_produto | Valor numérico com casas decimais — mapeado para numeric no PostgreSQL |
qtd_produto | Integer | qtd_produto | Quantidade inteira |
obs_produto | String | obs_produto | Observaçã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.
| Atributo | O que faz |
|---|---|
serial=true | Indica 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=true | Identifica 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_produto → setId_produto). Se o nome não bater, o campo fica null.
| Elemento | O 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.
| Constante | Valor | Onde é 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 |