Campo @embeddedId

18 respostas
V

Olá, pessoal

Preciso fazer um Insert na tabela de requisitoERP.

Porém essa tabela existe chave estrangeira.

Ela ta gerada da seguinte forma:

@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;

e a outra com chave estrangeira:

@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;

Gostaria de saber se alguém já trabalhou com esse tipo de estrutura, preciso fazer uma inserção mas não to conseguindo unir essas duas tabelas.

O codigo da Inserção é o descrito abaixo:

public boolean Inserir(Integer id_bts, Integer id_cap, Integer id_sub_cap, String doc, String requisito){
EntityManager em = Conecta.getEntityManager();

try {
         RequisitosErp requisitoerp = new RequisitosErp();
         requisitoerp.setRequisito(requisito);
         
         return true;

    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }finally{
        em.close();
    }

}

to conseguindo setar so o requisito, porem preciso setar todos os campos.

Se alguém puder me ajudar.

Obrigada.

18 Respostas

gregorioenrico

Vera,

vc precisa setar a pk. põe isso dentro do try:

RequisitosErp requisitoerp = new RequisitosErp();
requisitoerp.setRequisito(requisito); 

RequisitoErpPK pk = new RequisitoErpPK();
pk.setIdBts(id_bts);
pk.setIdCap(id_cap);
pk.setIdSubcap(id_sub_cap);
pk.setDoc(doc);

requisitoerp.setRequisitosErpPK(pk);

Abraços!

V

Olá Gregório!

Obrigada pela ajuda, resolveu o meu problema.

Aproveitando a oportunidade gostaria de perguntar se você sabe como fazer mascara para campo texto no Visual JSF.

Obrigada.

gregorioenrico

Olá, Vera.

É para a entrada de dados ou para a exibição de um dado obtido no BD?

Se for para exibição, vc pode usar um conversor e nele, no método getAsString(), vc retorna o texto no formato que vc quer.

Onde trabalho, usamos JavaScript para a entrada de dados, mais especificamente o JQuery. Muito fácil de usar. Deve resolver seu problema.

Abraços.

V

Oi gregorio,

Então eu segui seu conselho e fui procurar sobre o jquery, e acompanhei esse tutorial:

http://www.linhadecodigo.com.br/Artigo.aspx?id=1465

Porém não funcionou.
Daí vi no final que isso não funciona para netbeans 6, e to usando netbeans 6.5.

Você tem algum conhecimento sobre isso?Ou algum tutorial?Ou algum código?

Obrigada.

V

Gregorio,

Já que percebi que você entende do campo @embeddedId, quero te pedir um help.

Eu tenho que fazer uma consulta para retorno do campo “requisito”.

Essa é a estrutura do 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;

e essa é a estrutura do RequisitosErp:

@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;

Acho que vc até ja viu essas estruturas.

Esse é meu metodo de pesquisa, abaixo:

public RequisitosErpPK findDocERP(int id_bts, int id_cap, int sub_cap_id, String docERP) {

EntityManager em = Conecta.getEntityManager();

Query query = em.createNamedQuery(“RequisitosErpPK.recuperarRequisito”);

try {
query.setParameter("idBts",id_bts);
        query.setParameter("idCap",id_cap);
        query.setParameter("idSubcap",sub_cap_id);
        query.setParameter("doc",docERP);


        List ldocERP = query.getResultList();

        if (ldocERP.isEmpty()) {
            return null;
        } else {
            RequisitosErpPK reqERP = (RequisitosErpPK) ldocERP.get(0);
            return reqERP;
        }
    } catch (NoResultException e) {
        return null;
    } catch (Exception e1) {
        e1.printStackTrace();
        return null;
    } finally {
        em.close();
    }
}

Só q não da certo pq o campo requisito ta no outro mapeamento de RequisitosErp.

Você sabe conciliar um mapeamento com o outro para fazer a pesquisa?

Obrigada.

gregorioenrico

Oi, Vera.

Bem, o que vc realmente precisa pra isso é colocar o JQuery nas páginas que precisam da formatação do campo. O tutorial que vc leu deve funcionar no seu Netbeans, exceto na parte em que ele ensina como colocar JavaScript na página. Em vez de usar a paleta do Netbeans, edite a página do formulário manualmente e coloque a seguinte linha:

<script type="text/javascript" language="JavaScript" src="endereco_relativo_da_sua_pagina/pasta_de_scripts_javascript/com.jquery.js"></script>

Da mesma forma vc coloca os outros scripts que são citados no tutorial.

Abraços!

V

Olá!

Vc viu a pergunta que te fiz da consulta @embeddedId?

Obrigada.

gregorioenrico

Oi, Vera.

Só vi sua pergunta sobre o @EmbeddedId agora… Foi justamente enquanto eu redigia a outra postagem :smiley:

Bem, não vi a consulta “RequisitosErpPK.recuperarRequisito”. Posta ela aqui, por favor.

Abraços!

V

Então gregorio, nessa minha linha de raciocinio não tive como fazer essa consulta, pois como aparece a estrutura não tenho nenhuma query na estrutura da entidade RequisitosErpPK.

eu não to tendo ideia de como fazer essa consulta unindo as duas entidades.

Obrigada,.

gregorioenrico

Vera, vc pode fazer uma NamedQuery da seguinte maneira:

@NamedQuery(name = "obterRequisitoPelaChave",
query = "SELECT r FROM RequisitosErp r " +
              "WHERE r.requisitosErpPK.idBts = :idBts" +
              "AND r.requisitosErpPK.idCap = :idCap" + 
              "AND r.requisitosErpPK.idSubcap = :idSubcap" +
              "AND r.requisitosErpPK.doc = :doc")})

E o método de consulta (que deve retornar um RequisitosErp) deve ser da seguinte maneira:

public RequisitosErp obterRequisitoPelaChave(int id_bts, int id_cap, int sub_cap_id, String docERP) {
EntityManager em = Conecta.getEntityManager();
Query query = em.createNamedQuery("obterRequisitoPelaChave");
try {

query.setParameter("idBts",id_bts);
query.setParameter("idCap",id_cap);
query.setParameter("idSubcap",sub_cap_id);
query.setParameter("doc",docERP);

List ldocERP = query.getResultList();

if (ldocERP.isEmpty()) {
return null;
} else {
RequisitosErp reqERP = (RequisitosErp) ldocERP.get(0);
return reqERP;
}
} catch (NoResultException e) {
return null;
} catch (Exception e1) {
e1.printStackTrace();
return null;
} finally {
em.close();
}
}

E pode colocar essa NQ na classe RequisitosErp. Ela navega pela pk sem problemas. Essa NQ vai retornar um objeto do tipo RequisitosErp, aí vc pega o requisito com o getRequisito().

Tenta aí e depoi diz qual foi o resultado.

Abraços!

V

Oi gregorio!

Muitissimo obrigada pela ajuda!

Deu certinho!

Agora vou mecher com a parte das mascaras.

gregorioenrico

Que bom que deu certo!

:wink: Boa sorte com o resto.

V

Gregorio!

Eu tentei fazer a máscara como você explicou mas não deu certo, eu acho que é porque eu to usando o Visual JSF e não o jsf puro.

Abraço.

V

Gregorio,

Deixa te perguntar, to precisando montar uma tabela com os dados de (doc e requisito), só que tem o problema que o campo “doc” está na entidade:

@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;
e o campo requisito na entidade:

@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 = obterRequisitoPelaChave,query = SELECT r FROM RequisitosErp r WHERE r.requisitosErpPK.idBts = :idBts and r.requisitosErpPK.idCap = :idCap and r.requisitosErpPK.idSubcap = :idSubcap and r.requisitosErpPK.doc = :doc),

@NamedQuery(name = RequisitosErp.RequisitoERP,query = SELECT r FROM RequisitosErp r WHERE r.requisitosErpPK.idBts = :idBts and r.requisitosErpPK.idCap = :idCap and 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;

daí fiz o seguinte metodo para e linkei ele na tabela:

public RequisitosErp[] getErpCasoTeste(long id_btsERP,int id_capERP,int sub_cap_idERP){

RequisitosERPDAO reqERPDAO = new RequisitosERPDAO();
    List reqERPList = reqERPDAO.ListaReqERP(id_btsERP,id_capERP,sub_cap_idERP);
    Iterator it = reqERPList.iterator();
    RequisitosErp[] ReqERP = new RequisitosErp[reqERPList.size()];
    int i = 0;

    while (it.hasNext()) {
        ReqERP[i] = (RequisitosErp) it.next();
        i++;
    }

    getSessionBean1().setReqERP(ReqERP);

    return ReqERP;

}

Só que o problema é que só está exibindo requisito;

Você tem idéia de como posso pegar o outro campo, DOC.

Obrigada.

gregorioenrico

Vera, vc tentou reqERP.getRequisitosErpPK.getDoc()?

V

Mas Gregorio, onde você fala para eu colocar essa linha de código?

Dentro de getErpCasoTeste?

Obrigada.

gregorioenrico

No lugar que vc deve exibir o doc. Se for numa pagina JSF, vc deve colocar <h:outputText value="#{nomeDoBean.requisitosErpPK.doc}". Se for no console, System.out.println(requisitos.getRequisitosErpPK().getDoc().

O que vc está usando pra exibir os dados? Swing? JSP? …

V

Então Gregorio, eu to usando Visual JSF.

E queria montar todos os campos tanto da RequisitosErpPk tanto da RequisitosErp, nesse metodo abaixo.

De forma que quando eu linkar a tabela a ReqERP, possa visualizar tanto os campos de uma quanto da outra.
Mas como to fazendo, to conseguindo visualizar somente da RequisitoErp.

public RequisitosErp[] getErpCasoTeste(long id_btsERP,int id_capERP,int sub_cap_idERP){
RequisitosERPDAO reqERPDAO = new RequisitosERPDAO();

List reqERPList = reqERPDAO.ListaReqERP(id_btsERP,id_capERP,sub_cap_idERP);
    Iterator it = reqERPList.iterator();

    RequisitosErp[] ReqERP = new RequisitosErp[reqERPList.size()];

    int i = 0;
    while (it.hasNext()) {
        ReqERP[i] = (RequisitosErp) it.next();
        i++;
    }

    getSessionBean1().setReqERP(ReqERP);
    return ReqERP;

}
Criado 25 de maio de 2009
Ultima resposta 29 de mai. de 2009
Respostas 18
Participantes 2