Bom vamos la…acho q estou me enrolando com a conf…
Tenho as seguinte tabelas: OPERACAO, DOCUMENTACAO, DOCUMENTACAO_OPERACAO, SIMPLIM.
OPERACAO: Esta tabela contem id, valores(iof, despesas, etc…), cliente, tipo, e mais um monte de campos…
DOCUMENTACAO: id, nome, tipo, cliente, aprovado, etc…
DOCUMENTACAO_OPERACAO: esta é uma tabela de resolucao onde cadastro o id_operacao e o id_documentacao.
SIMPLIM id, varios campos especificos, id_operacao.
[i]BEAN DOCUMENTACAO:[/i] Antes tinha imaginado que uma operacao iria ter varias documentacoes e uma documentacao poderia estar em mais de uma operacao diferente, por isso fiz o mapeamento N:N, contudo agora estou vendo que tera de ser 1:N, pois a pagina de cadastro de documentacao esta dentro da pagina de cadastro de operacao. Sendo assim cada operacao tera sua lista de documentos especificos. Terei que mudar, mas preciso ter certeza pois isso implica em varias partes do codigo.
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "TB_DOCUMENTACAO_OPERACAO",
joinColumns = @JoinColumn(name = "ID_DOCUMENTACAO", referencedColumnName = "ID_DOCUMENTACAO"),
inverseJoinColumns = @JoinColumn(name = "ID_OPERACAO", referencedColumnName = "ID_OPERACAO"))
public Collection<Operacao> getOperacoes() {
return operacoes;
[b]BEAN SIMPLIM:[/b]
@OneToOne(targetEntity = Operacao.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
public Operacao getOperacao() {
return operacao;
}
CONTROLLER: no meu controller de simplim por exemplo, chamo um servico que cadastra uma operacao simplim onde esta tem um objeto operacao e apos isso ele grava as documentacoes referentes a esta operacao.
public String gravar() {
String retorno = PAGINA_SUCESSO;
try {
this.setTipoAcao(null);
this.setExibirProgress(false);
this.setTipoGravacao(SituacaoOperacaoEnum.CADASTRADA);
this.setExibeMenssagemCadastro(true);
// verifica se o id da operação é diferente de nullo
Long id = null;
if (getIdOperacao() != null) {
id = new Long(getIdOperacao());
}
// realiza chamada para o serviço que irá realizar gravação
Simplim simplim = convertModelToEntity();
// atualiza valores calculados
simplim.getOperacao().setValorMN(valorMN);
simplim.getOperacao().setValorIOF(valorIof);
simplim.getOperacao().setValorDespesas(valorDespesa);
simplim.getOperacao().setValorTotal(valorTotal);
//adiciona simplim
cambioService.adicionarSimplim(simplim, id);
List<Operacao> operacoes = new ArrayList<Operacao>();
operacoes.add(simplim.getOperacao());
//cadastra a documentacao que o cliente fez upload
for (Documentacao doc : docs) {
doc.setPessoa(pessoaLogada);
doc.setOperacoes(operacoes);
cambioService.adicionarDocumentacao(doc);
}
addMessageSucesso();
logarOperacao(simplim, LogAcaoEnum.INCLUSAO);
this.inicializarFormulario();
} catch (BusinessException e) {
String message = FacesBundleUtil.getInstance().getString(e.getMessage());
addMessage(FacesMessage.SEVERITY_ERROR, message, e);
retorno = PAGINA_FALHA;
} catch (ValidateException e) {
addMessage(FacesMessage.SEVERITY_INFO, e.getMessages(), e);
retorno = PAGINA_FALHA;
} catch (Exception e) {
String message = FacesBundleUtil.getInstance().getString(e.getMessage());
addMessage(FacesMessage.SEVERITY_ERROR, message, e);
retorno = PAGINA_FALHA;
}
Este metodo convertModelToEntity() ira preencher todos os campos do obj Simplim, inclusive a operacao.
Aii eis a minha duvida… no momento que seto uma operacao dentro do obj simplim ele ja cadastra no banco???
Pois mando gravar o simplim desta forma: getEntityManager().merge(simplim);
O sistema esta cadastrando de 2 a 3 vezes a mesma informacao. Quando na verdade teria que cadastrar apenas 1 vez.
ex. Hje esta cadastrando deste jeito 3 operacoes, 2 documentos e na tabela de resolucao uma operacao pra cada documento. Tudo errado…
tabela operacao
id: 125 - simplim01
id: 126 - simplim01
id: 127 - simplim01
tabela documentacao
id: 1 - rg
id: 2 - cpf
tabela documentacao_operacao
126 - 1
127 - 2
Será que deu pra entender??? aff confuso…
bom agradeco a atencao…
att, 