Primeira edição da sequência CREATE. O DAO ganha o método daoInsert e o Model ganha o wrapper insert(bean). Duas adições mínimas — uma linha de lógica cada — que seguem exatamente o mesmo padrão do daoDelete da sequência anterior.
package br.xt.app.departamento.produto;
import br.jasap.core.AppManager;
import br.jasap.dao.Query;
import br.jasap.util.JasapList;
import br.xt.AppsRootDAO;
public class DepartamentoProdutoDAO extends AppsRootDAO {
public DepartamentoProdutoDAO() {
}
public DepartamentoProdutoDAO(AppManager manager) {
setManager(manager);
setDataBase(manager.getDataBase());
}
public void daoList(JasapList list) throws Exception {
StringBuilder sql = new StringBuilder();
sql.append("select a.* from " + DepartamentoProdutoBean.TABLE + " a <orderby>");
Query query = getDataBase().getQuery(sql.toString());
select().executeList(query, list);
while (query.next()) {
DepartamentoProdutoBean bean = new DepartamentoProdutoBean();
query.populateBean(bean);
list.getList().add(bean);
}
query.release();
}
// ADICIONAR
public void daoInsert(DepartamentoProdutoBean bean) throws Exception {
insert().execute(bean, DepartamentoProdutoBean.TABLE);
}
// FIM
public void daoDelete(DepartamentoProdutoBean bean) throws Exception {
delete().execute(bean, DepartamentoProdutoBean.TABLE);
}
}
Mudança nesta sequência: somente o método daoInsert (verde). Tudo o mais já existia das sequências CRUD READ e CRUD DELETE.
package br.xt.app.departamento.produto;
import br.jasap.core.AppManager;
public class DepartamentoProdutoModel extends DepartamentoProdutoDAO {
public DepartamentoProdutoModel(AppManager manager) {
super(manager);
}
// ADICIONAR
public void insert(DepartamentoProdutoBean bean) throws Exception {
daoInsert(bean);
}
// FIM
}
Mudança nesta sequência: somente o método insert (verde). O construtor já existia da sequência CRUD READ.
insert().execute funciona?
Mesmo mecanismo do delete().execute — via reflection. O helper insert() herdado de JasapDAO inspeciona o Bean procurando todos os getters, monta automaticamente:
INSERT INTO departamento.produto (nome_produto, vl_produto, qtd_produto, obs_produto)
VALUES (?, ?, ?, ?)
O campo id_produto é excluído automaticamente porque tem @DBInfo(serial=true) — o banco gera o próximo ID via sequence.
Cada getter do Bean vira uma coluna + valor. O chamador só precisa preencher o Bean com os dados do formulário — todo o resto é o framework.
O Model parece redundante — insert(bean) só chama daoInsert(bean). Mas a separação tem um propósito:
dao (daoInsert, daoDelete, daoList). Só SQL, sem regra de negócio.insert, update). Pode chamar múltiplos DAOs, aplicar validações, disparar cascatas.Hoje o insert é um wrapper direto. Mas quando a entidade crescer (ex: cascade de status, geração de campo qs_produto, vínculo com outras tabelas), a lógica extra entra no Model — o DAO continua limpo.
As Actions NUNCA chamam o DAO diretamente — sempre via Model. Isso garante que qualquer regra adicionada no Model será aplicada automaticamente em todos os pontos de entrada.