[RESOLVIDO] Erro ao deletar Registro - JPA

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.

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,

[quote=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,[/quote]

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.

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,

[quote=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,[/quote]

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

Alguém?

[code]
Tabela1 tab1;
Tabela2 tab2;

tab1.setTab2(null);

tabela1Dao.update(tab1);[/code]

Ja tentou assim ?

[quote=rof20004][code]
Tabela1 tab1;
Tabela2 tab2;

tab1.setTab2(null);

tabela1Dao.update(tab1);[/code]

Ja tentou assim ?

[/quote]

Olá rof20004 obrigado pela atenção

irei tentar e ja respondo o resultado

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

é isso mesmo!

Nesse caso se tiver cascadeAll , basta chamar:

tabela1DAO.remove(tab1);

[quote=rof20004]Nesse caso se tiver cascadeAll , basta chamar:

tabela1DAO.remove(tab1);[/quote]

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.