Exclusão chave composta

3 respostas
V

Bom dia pessoal,

Preciso fazer a exclusão de um registro, porém existe chaves compostas entre as tabelas.

Abaixo a estrutura das tabelas:

Estrutura da tabela “requisitos_erp”

@Entity

@Table(name = requisitos_erp)

@NamedQueries({@NamedQuery(name = RequisitosErp.findAll, query = SELECT r FROM RequisitosErp r),

@NamedQuery(name = RequisitosErp.findByIdBts, query = SELECT r FROM RequisitosErp r WHERE r.requisitosErpPK.idBts = :idBts),

@NamedQuery(name = RequisitosErp.findByIdCap, query = SELECT r FROM RequisitosErp r WHERE r.requisitosErpPK.idCap = :idCap),

@NamedQuery(name = RequisitosErp.findByIdSubcap, query = SELECT r FROM RequisitosErp r WHERE r.requisitosErpPK.idSubcap = :idSubcap),

@NamedQuery(name = RequisitosErp.findByDoc, query = SELECT r FROM RequisitosErp r WHERE r.requisitosErpPK.doc = :doc)})

public class RequisitosErp implements Serializable {

private static final long serialVersionUID = 1L;

@EmbeddedId

protected RequisitosErpPK requisitosErpPK;

<a class="mention" href="/u/basic">@Basic</a>(optional = false)

<a class="mention" href="/u/lob">@Lob</a>

@Column(name = “requisito”)

private String requisito;

Estrutura da tabela “RequisitosErpPK”

@Embeddable

public class RequisitosErpPK implements Serializable {

<a class="mention" href="/u/basic">@Basic</a>(optional = false)

@Column(name = “id_bts”)

private long idBts;

<a class="mention" href="/u/basic">@Basic</a>(optional = false)

@Column(name = “id_cap”)

private int idCap;

<a class="mention" href="/u/basic">@Basic</a>(optional = false)

@Column(name = “id_subcap”)

private int idSubcap;

<a class="mention" href="/u/basic">@Basic</a>(optional = false)

@Column(name = “doc”)

private String doc;

Alguém poderia me ajudar a resolver essa exclusão?

Obrigada.

3 Respostas

fantomas

@Entity @Table(name = "requisitos_erp") @NamedQueries({@NamedQuery(name = "RequisitosErp.findAll", query = "SELECT r FROM RequisitosErp r"), @NamedQuery(name = "RequisitosErp.findByIdBts", query = "SELECT r FROM RequisitosErp r WHERE r.requisitosErpPK.idBts = :idBts"), @NamedQuery(name = "RequisitosErp.findByIdCap", query = "SELECT r FROM RequisitosErp r WHERE r.requisitosErpPK.idCap = :idCap"), @NamedQuery(name = "RequisitosErp.findByIdSubcap", query = "SELECT r FROM RequisitosErp r WHERE r.requisitosErpPK.idSubcap = :idSubcap"), @NamedQuery(name = "RequisitosErp.findByDoc", query = "SELECT r FROM RequisitosErp r WHERE r.requisitosErpPK.doc = :doc")}) public class RequisitosErp implements Serializable { private static final long serialVersionUID = 1L; @EmbeddedId protected RequisitosErpPK requisitosErpPK; @Basic(optional = false) @Lob @Column(name = "requisito")

@Embeddable public class RequisitosErpPK implements Serializable { @Basic(optional = false) @Column(name = "id_bts") private long idBts; @Basic(optional = false) @Column(name = "id_cap") private int idCap; @Basic(optional = false) @Column(name = "id_subcap") private int idSubcap; @Basic(optional = false) @Column(name = "doc") private String doc;

:shock:

Quem faz (constroi a sql e executa) a deleção é o seu mecanismo ORM, você deveria fazer algo como:

entityManager.remove(obj);

Tô começando a achar que vc não contou tudo pra nós rsrsrsr!

flws

V

Então a parte onde estou excluindo está assim:

public String imgExcluir_action() {

long id_bts_erp = (Long) stIdBts.getValue();

int  id_cap_erp = (Integer) stidCap.getValue();

int  sub_cap_erp = (Integer) stIdSubcap.getValue();

String docERP;

String Requisito;
docERP = (String) stDocERP.getText();
     Requisito = stRequisito.getText().toString();

    //Obtendo o requisito a ser excluído
    RequisitosERPDAO obterRequisitoDAO = new RequisitosERPDAO();
    RequisitosErp reqERP = obterRequisitoDAO.obterRequisitoPelaChave(id_bts_erp,id_cap_erp,sub_cap_erp,docERP);

    RequisitosERPDAO ExcluirRequisitoDAO = new RequisitosERPDAO();
    try {
        ExcluirRequisitoDAO.Excluir(reqERP);
        info("Requisito excluído com sucesso!");
    } catch (Exception e) {
        info("Erro - Requisito não pôde ser excluído!");
    }
     return "CapituloEdicao";
}

//Método da exclusão

public void Excluir(RequisitosErp reqErp){

EntityManager em = Conecta.getEntityManager();

try {

EntityTransaction utx = em.getTransaction();

RequisitosErp reqERP = em.find(RequisitosErp.class,reqErp);
utx.begin();
        em.remove(reqErp);
        utx.commit();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        em.close();
    }

}

Só que não funciona dessa forma, dá o seguinte erro:

java.lang.IllegalArgumentException: Provided id of the wrong type. Expected: class beans.RequisitosErpPK, got class beans.RequisitosErp

To pedindo um help de alguma outra forma de fazer.

Muito Obrigada.

fantomas

VeraApFigueiredo

  1. Tente utilizar as tags Code (ver os botões acima) da próxima vez, fica mais fácil de visualizar o código.

  2. Na próxima vez, se for preciso, envie a stack trace inteira; ela indica o número da onde ocorreu o erro. Isto facilita bastante também.

  3. A entidade que vc está tentando excluir utiliza chave composta representada pela classe RequisitosErpPK, logo os acessos à esta entidade tem que ser feita através das instancias desta classe. Como vc esta tentando utilizar a instancia da classe RequisitosErp ocorreu este erro; veja este detalhe em negrito da mensagem de erro:

Acredito que erro ocorreu na execução desta linha:

RequisitosErp reqERP = em.find(RequisitosErp.class,reqErp);

P.S Faça uma revisão no tutorial onde fala de entidades com chaves compostas, para aumentar seu dominio sobre o problema.

flws

Criado 5 de junho de 2009
Ultima resposta 8 de jun. de 2009
Respostas 3
Participantes 2