Hibernate nao carrega coleção![RESOLVIDO]

11 respostas
renato_ramos

Oi!

pessoal meu caso é o seguinte:

eu tenho tres classes de persistencia… vamos supor A , B e C

esse é o relacionamento
A n-n B
B 1-n C

quando eu pego um objeto da classe A … eu consigo carregar a coleção da classe B… mas os objetos da coleção não carregam os objetos da Classe C…

já procurei em um monte delugar algo parecido… mas não achei…

mt obrigado =D

[]'s

11 Respostas

alberto_ribeiro

bom dia, o problema é que na classe B tem uma lista de C e não está carregando ? se sim manda como você mapeou a lista de C na classe B…

renato_ramos

oie!

a classe B

public class Questao implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id_questao")
    private Integer idQuestao;
    @Basic(optional = false)
    @Column(name = "desc_questao")
    private String descQuestao;
    @ManyToMany(cascade=CascadeType.ALL, mappedBy="questaoCollection", fetch = FetchType.LAZY)
    @JoinTable(name = "tbl_modelo_questionario", joinColumns = {@JoinColumn(name = "id_questao", referencedColumnName = "id_questao")}, inverseJoinColumns = {@JoinColumn(name = "id_questionario", referencedColumnName = "id_questionario")})
    private Collection<Questionario> questionarioCollection;
    @OneToMany(cascade=CascadeType.ALL, mappedBy = "idQuestao", fetch = FetchType.LAZY)
    private Collection<Alternativa> alternativaCollection;

e a classe C

public class Alternativa implements Serializable {
    private static final long serialVersionUID = 1L;
    @Basic(optional = false)
    @Column(name = "desc_alternativa")
    private String descAlternativa;
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id_alternativa")
    private Integer idAlternativa;
    @JoinColumn(name = "id_questao", referencedColumnName = "id_questao")
    @ManyToOne(cascade=CascadeType.PERSIST)
    private Questao idQuestao;

sou iniciante com hbernate =D

obrigado pela atenção Alberto

alberto_ribeiro

opa pelo que eu vi, a coleção está LAZY então quando você der um simples get nessa coleção o hibernate deveria trazer os dados para você, agora pelo que lembro se quiser que já esteja carregada troque para EAGER

@OneToMany(cascade=CascadeType.ALL, mappedBy = "idQuestao", fetch = FetchType.EAGER)  
private Collection<Alternativa> alternativaCollection;

ve ai se rola ou não…

renato_ramos

já tinha tentado antes com como EAGER

mas dá exeção, “org.hibernate.HibernateException: cannot simultaneously fetch multiple bags”

no caso a classe A que é a classe questionario… carregar nesse modo as questões ^^’

tah aqui o mapeamento dela

public class Questionario implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id_questionario")
    private Integer idQuestionario;
    @Basic(optional = false)
    @Column(name = "desc_pesquisa")
    private String descPesquisa;
    @ManyToMany(fetch = FetchType.EAGER)
    private Collection<Questao> questaoCollection;

e se eu coloco lazy nessa, ele não carrega as questões… a minha questão é como inicializar uma coleção que tem modo Lazy…
acho que é esta =D

mt obrigado :smiley:

alberto_ribeiro

opa !!!

então, o que eu sei é que quando está LAZY é só você pegar seu objeto e usar o get que o hibernate vai no banco para carregar a coleção, assim:

questao.getAlternativaCollection(); // isso deveria fazer o hibernate ir ao banco carregar a lista...

o problema de “org.hibernate.HibernateException: cannot simultaneously fetch multiple bags” é porque você está usando como colections, se trocar para Set vai funcionar acredito eu, deixando como eager…rs

@OneToMany(cascade=CascadeType.ALL, mappedBy = "idQuestao", fetch = FetchType.EAGER)    
 private Set<Alternativa> alternativaCollection;

[]'s

renato_ramos

a opção 2 funcionou… mas dá pau no resto do programa… porque eu estou setando ArrayList nas colections na hora de salvar

eu não posso dar get(eu acho)

olha oque eu quero…

eu estou fazendo um metodo pra serializarpara xml o objeto questionario

quando eu carrego ele usando

public Questionario carregar(Integer id) throws DataAccessException
    {
        return em.find(Questionario.class, id);
    }

ele não carrega as bags das questões

assim… ele não serialziara a coleção tambem ^^’

valeu!

alberto_ribeiro

você poderia trocar de ArrayList para HashSet, ou tem que ser ArrayList mesmo ?

você chama o método que faz find na Questão ele carrega as questoes porém nao carrega as alternativas, depois você pode inicializar as bags dando o get, agora porque você não pode dar um get ??? o get é só para inicializar, depois de inicializar todas você manda serializar…

[]'s

renato_ramos

tentei fazer o get assim

ArrayList<Questao> questaoList = new ArrayList<Questao>();
                questaoList.addAll(questionario.getQuestaoCollection());
                for(int i = 0; i < questaoList.size();i++)
                {
                    Questao questao = questaoList.get(i);
                    ArrayList<Alternativa> alternativaList = new ArrayList<Alternativa>();
                    alternativaList.addAll(questao.getAlternativaCollection());
                    questao.setAlternativaCollection(alternativaList);
                    questaoList.add(i, questao);

                }
                questionario.setQuestaoCollection(questaoList);

e deu a msm execao

com hashset eu não tentei… como eu usaria ele?

alberto_ribeiro

é o mesmo que ArrayList em relação a metodos(claro que tem diferenças quanto o funcionamento) apenas troque para HashSet e deve ter alguns metodos diferentes, caso algum método não exista de uma procurada sobre HashSet que vai achar muitas coisas e é bem simples…

renato_ramos

alberto muito obrigado mesmo… se nao sabe o quanto eu procurei atraz de uma solução pra isso

hashset funcionou =D

erroneamente falando o hashset é a ArrayList do set? xD

valeeu!

alberto_ribeiro

acho que isso vai te ajudar

http://blog.caelum.com.br/2006/10/04/performance-hashset-em-vez-de-arraylist/

[]'s

Criado 24 de novembro de 2009
Ultima resposta 24 de nov. de 2009
Respostas 11
Participantes 2