[RESOLVIDO] Erro ao deletar Registro - JPA

11 respostas
S

Olá a todos,

Estou com o seguinte problema, para excluir um determinado registro de uma tabela (tabela1) preciso excluir outro em outra tabela (tabela2) que tem um FK com a tabela 1 então antes de exluir este registro executo um select na tabela 2 onde consta todos os registros que tem como referência ao registro que necessito deletar, deleto todos esses registros que retornaram da minha select e após isso deleto o registro da tabela 1. Ok isso funcionou IbExpert (utilizo firebird). Porém no JPA não da certo mesmo excluindo esses registros da tabela 2 quando tento executar o delete na tabela 1 ele ainda aponta erro de violation of FOREIGN KEY constraint. É como se o JPA não sinchoniza com o banco para ver que aqueles registros ja forão excluídos da tabela 2. Existe algum modo de forçar um sincronismo para permitir a exclusão desse item na tabela 1?

Espero ter consigo explicar com clareza!

Obrigado pela atenção.

11 Respostas

magnocosta

Olá sciuba,

O JPA tem seus próprios recursos para deletar registros em varias tabelas, o famoso Cascade é bem eficiente.
Na entidade que possui a lista mapeada insira a linha abaixo:

@OneToMany (cascade = CascadeType.REMOVE mappedBy = "turma")
private List<Aluno> alunos;

Att,

S

magnocosta:
Olá sciuba,

O JPA tem seus próprios recursos para deletar registros em varias tabelas, o famoso Cascade é bem eficiente.
Na entidade que possui a lista mapeada insira a linha abaixo:

@OneToMany (cascade = CascadeType.REMOVE mappedBy = "turma")
private List<Aluno> alunos;

Att,

Oi magno vou postar hoje como esta meu relacionamento da tabela2 para a tabela1

@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
        @JoinColumn(name = "GUID", referencedColumnName = "GUID", insertable = false, updatable = false),
        @JoinColumn(name = "ID_ACD_DISCIPCONTEUDOITEM", referencedColumnName = "ID_ACD_DISCIPCONTEUDOITEM", insertable = false, updatable = false)})
    private AcdDiscipconteudoitem acdDiscipconteudoitem;

Você acha então que é so eu colocar:

@ManyToOne(fetch = FetchType.LAZY , cascade= CascadeType.REMOVE)

Que irá resolver o problema que estou tendo?

Obrigado.

magnocosta

Na verdade vc deve colocar o relacionamento na outra entidade (da tabela 1)
Pq ao apagar os dados da tabela 1 vc deve disparar um evento em cascata na tabela 2

Att,

S

magnocosta:
Na verdade vc deve colocar o relacionamento na outra entidade (da tabela 1)
Pq ao apagar os dados da tabela 1 vc deve disparar um evento em cascata na tabela 2

Att,

Magno segue o mapeamento da tabela 1 ( hoje dessa forma acontece o erro)

@OneToMany(cascade = CascadeType.ALL, mappedBy = "acdDiscipconteudoitem")
    private Collection<AcdPlanoaulaDiscipconteudo> acdPlanoaulaDiscipconteudoCollection;

Sendo cascade ALL creio que ja atenderia correto?

Obrigado

S

Alguém?

R
Tabela1 tab1;
Tabela2 tab2;


tab1.setTab2(null);

tabela1Dao.update(tab1);

Ja tentou assim ?

S
rof20004:
Tabela1 tab1;
Tabela2 tab2;


tab1.setTab2(null);

tabela1Dao.update(tab1);

Ja tentou assim ?

Olá rof20004 obrigado pela atenção

irei tentar e ja respondo o resultado

R

Lendo direito acho que entendi errado, heheheh, voce quer deletar um registro da tabela1, mas precisa primeiro deletar o registro da tabela2 certo ? é isso ?

S

é isso mesmo!

R

Nesse caso se tiver cascadeAll , basta chamar:

tabela1DAO.remove(tab1);

S

rof20004:
Nesse caso se tiver cascadeAll , basta chamar:

tabela1DAO.remove(tab1);

O cascade All tb não rolou, porém consegui resolver de outra forma. Creio eu que não seja a mais elegante e correta mas atendeu oque eu precisava.

Após excluir os registros de referência da tabela2 utilizando .remove() do JPA, criei um metodo para excluir o registro que precisava na tabela1 e o chamo logo em sequência.

Segue metodo:

public void excluiRegistroAtividade(Long idAcdDiscipConteudoItem){
        String sqlQuery = "delete from Acd_DiscipConteudoItem ad where ad.id_acd_discipconteudoitem = :idAcdDiscipConteudoItem ";
        
        Query q = acdDiscipconteudoitemDao.createSQLquery(sqlQuery);
        q.setParameter("idAcdDiscipConteudoItem", idAcdDiscipConteudoItem);
        
        q.executeUpdate();
    }

Resolvendo o meu problema.

Obrigado pela ajuda.

Criado 10 de abril de 2013
Ultima resposta 11 de abr. de 2013
Respostas 11
Participantes 3