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
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…
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
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…
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
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
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!
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
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?
é 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…
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!