Pessoal, estou postando este tópico para levantar uma questão:
Qual a melhor maneira de persistir objetos relacionados.
Considero como PASSOS neste processo as principais ETAPAS, desconsiderando o que é trivial.
Tenho o seguinte modulo no sistema:
Cadastro de fórmulas.
Cadastro de atributos de uma fórmula.
Cadastro de sub fórmulas.
Uma fórmula tem muitos atributos e muitas sub formulas ok.
Para esta situação eu criei a seguinte rotina em minha action (salvarFormula) :
1º Crio uma nova fórmula (Objeto principal do negócio) . (PASSO 1)
2º Crio uma lista de atributos e insiro os atributos da fórmula. (PASSO 2.0)
3º Crio uma lista de subFormulas e insiro as subFormulas da fórmula. (PASSO 2.1 [PROCESSO IDENTICO PASSO 2.0])
4º Crio um método DAO salvarFormula e envio como parametro a fórmula e os lists: atributoS, subFormulaS (3 parametros). (PASSO 3)
---- Neste método inicio a transação
---- persisto a formula (PASSO 4)
---- em loop persisto atributo por atributo ( só neste momento (interação por interação) vinculo a fórmula ao atributo ) (PASSO 5.0)
---- em loop, faço o mesmo com as subformulas (PASSO 5.1)
---- fecho a transação
Notas :
---- Obtive erro quando vinculei a formula aos atributos antes da iteração (laço) pois o objeto formula ainda não estava persistido.
---- Não usei cascades para persistir os dados
Perguntas :
Alguem dá preferencia pelo cascade ? por que ?
Este é o melhor modelo de persistir objetos relacionados ? Sim/Não porquê ?
METODO DAO
/** SALVA FORMULA E ATRIBUTOS E FORMULAS MES **/
public void salvar(RgFormula rgFormula,
Collection<RgFormulaAtributo> rgFormulaAtributoS,
Collection<RgFormulaMes> rgFormulaMesS) {
Transaction tx = session.beginTransaction();
try{
session.persist(rgFormula); // PERSISTE FORMULA (OBJ PRINCIPAL)
if(rgFormulaAtributoS.size()>0){ // SALVA ATRIBUTOS
for (RgFormulaAtributo rgFormulaAtributo : rgFormulaAtributoS) {
rgFormulaAtributo.setRgFormula(rgFormula);
session.persist(rgFormulaAtributo);
}
}
if(rgFormulaMesS.size()>0){ // SALVA FORMULA MES
for (RgFormulaMes _rgFormulaMes : rgFormulaMesS) {
_rgFormulaMes.setRgFormula(rgFormula);
session.persist(_rgFormulaMes);
}
}
tx.commit();
}catch (Exception e) {
EeMail.sEmailAdm("ERRO NO CADASTRO DE FÓRMULAS",e.getMessage());
e.printStackTrace();
tx.rollback();
}
}
[]s
Jsign