Dúvida com relações

12 respostas
B

Possuo 2 classes, por exemplo, Pessoa e Carro, e estas tem relação 1:n, quando carrego um objeto Pessoa e quero carregar juntamente a este a List que pertence ao objeto Pessoa.

Mas não cheguei a uma conclusão de como executar. O Meu código é parecido com este,

//Classe PessoaImp
@Override
    public Pessoa procurar(String nome){
        emf = Persistence.createEntityManagerFactory("BDPU");
        em = emf.createEntityManager();
        em.getTransaction().begin();

        pessoaDAO = new PessoaDAO(em, Fontes.class);
        Pessoa p = pessoaDAO.load(nome);
                
        em.getTransaction().commit();
        em.close();
        emf.close(); 
        
        return p;
        
    }

//Classe PessoaDAO

public Pessoa load(String nome) {
        return em.find(Pessoa.class, nome);
    }

12 Respostas

Hebert_Coelho

Aqui mostra dois modos de fazer isso:
Quatro soluções para LazyInitializationException

Colocar EAGUER na anotação ou por query.

B

Pois é, vou postar meu código aqui.

//Classe Fontes
....
@OneToMany(fetch=FetchType.EAGER)
    private List<Contas> contasList;
....


//FontesImp

public Fontes procurar(int Id){
        emf = Persistence.createEntityManagerFactory("SIAGPU");
        em = emf.createEntityManager();
        em.getTransaction().begin();
        fontesDAO = new FontesDAO(em, Fontes.class);
        
        Fontes fonte = fontesDAO.load(Id);
                
        em.getTransaction().commit();
        em.close();
        emf.close(); 
        
        return fonte;
        
    }

//DAO

public Fontes load(int id) {
        return em.find(Fontes.class, id);
    }

//Classe Teste

Fontes fonte = fonte_imp.procurar(250);
System.out.print(fonte.getContasList().size());

//A Classe Fonte faz a relação 1:n com a classe Conta, e no BD há 3 registros que fiz com a fonte 250
//O Resultado printado é 0

Achei estranho, pois, não parece divergir do exemplo do post.

Hebert_Coelho

Duas coisas:

  1. Qual implementação do JPA você está utilizando? OpenJPA? Hibernate? O que?
  2. Se você colocar o fonte.getContasList().size() após o Fontes fonte = fontesDAO.load(Id); o que acontece?
B

Estou usando o hibernate, e deu 0 denovo. hehe

Hebert_Coelho

bobleujr:
Estou usando o hibernate, e deu 0 denovo. hehe
Qual consulta você fez no banco de dados para você ter certeza que ele teria 3 itens?

B

Não entendi sua pergunta, mas veja como a recíproca é verdadeira,

//Classe Teste
Fontes fonte = fonte_imp.procurar(250);  
List<Contas> list = conta_imp.pesquisaByFonte(fonte);   
System.out.println(list.size());


//Classe ContasImp

public List<Contas> pesquisaByFonte(Fontes fonte){
        emf = Persistence.createEntityManagerFactory("SIAGPU");
        em = emf.createEntityManager();
        em.getTransaction().begin();
        
        contasDAO = new ContasDAO(em, Contas.class);
        List<Contas> list = this.contasDAO.buscaPorFonte(fonte);
        
        em.getTransaction().commit();
        em.close();
        emf.close();
        
        return list;

}

//Classe ContasDAO


 public List<Contas> buscaPorFonte(Fontes fonte){
        
        Query query = em.createNamedQuery("Contas.findByFonte");
        query.setParameter("fonte",fonte);
        List<Contas> contas = query.getResultList();
        
        return contas;      
        
    }

// O Resultado foi 3
Hebert_Coelho

Como estão essas classes? Tem como você colocar apenas elas e seus relacionamentos e os ids? Não precisa colocar mais dados ñ.

B
public class Contas implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idcontas")
    private Integer idcontas;

    ......
    @JoinColumn(name = "fontes_idfontes", referencedColumnName = "idfontes")
    @ManyToOne
    private Fontes fontesIdfontes;
//getters setters

public class Fontes implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "idfontes")
    private Integer idfontes;
    @Column(name = "nome")
    private String nome;
    @OneToMany(fetch=FetchType.EAGER)
    private List<Contas> contasList;

//getters setters
Hebert_Coelho

Não sei se é isso, mas tá faltando um mappedBy no @OneToMany(fetch=FetchType.EAGER).

Altere, apague os dados e cadastre novamente. Se possível, apague até as colunes de relacionamento e deixe criar de novo.

B

Ok, tentarei, obrigado pela ajuda, depois posto os resultados.

B

Isso mesmo, deu certo. Obrigado pela ajuda.

Ficou assim,

@OneToMany(fetch=FetchType.EAGER, mappedBy = "fontesIdfontes")
private List<Contas> contasList;
Hebert_Coelho

Lembre-se de uma coisa.

Em um relacionamento bidirecional você precisa sempre ter alguem com mappedBy. Caso você não faça isso o JPA irá entender que um relacionamento é distinto do outro. [=

\o_

Criado 3 de agosto de 2012
Ultima resposta 3 de ago. de 2012
Respostas 12
Participantes 2