Duvida com hibernate[RESOLVIDO]

7 respostas
renato_ramos

Oi pessoal,

minha duvida deve ser básica… mas não encontrei nd falando sobre… (devo t procurado errado)

mas eu tenho uma relação OneToMany em classe… e nessa classse tem a collection da outra classe… complicado neh?

exemplificando…

uma classe questao… que tem varias alternativas…

a duvida é se eu popular a colection alternativa no objeto da classe da questao… e gravar… o hibernate salva a collection tambem??

ou eu tenho que popular o objeto alternativa tambem??

existe alguma boa pratica pra isso??

mt obrigado pela atenção!

7 Respostas

cdorner

Não utilize hibernate puro, mesmo com a annotations, utilize JPA

lembresse sempre desenvolva para uma especificação e nunca para uma implementação

da uma olhada no link abaixo

:)P

renato_ramos

não tendi mt não 'oO

vo explicar minha arquitetura…

Persistencia - Dao - Facade … exemplo q eu peguei de um livro xD

ms no livro não tinha OneToMany

agora eu to perdido …

mas é possivel fazer oq eu perguntei?.. mesmo nao sendo uma boa pratica?

rafaelk

Para resolver seu problema é só colocar OneToMany(cascade = CascadeType.ALL, mappedBy"atributoNaClasseFilho"), quando vc persistir o objeto questão todas as alternativas serão persistidas também.

Muitas vezes temos que esquecer disso, pois o mundo não é perfeito e ainda neste caso, estaremos usando uma anotação especificada.

renato_ramos

entao eu fiz assim…

QuestaoFacade questaoFacade = (QuestaoFacade) context.getBean("questaoFacade");
        Questao questao = (Questao) context.getBean("questao");

        
        ArrayList <Alternativa> alternativaList = new ArrayList<Alternativa>();
        int index = listModelAlternativa.getSize();
        for(int i = 0; i < index  ; i++)
        {
            alternativaList.add((Alternativa) listModelAlternativa.getElementAt(i));

        }
        questao.setDescQuestao(txtQuestao.getText());
        questao.setAlternativaCollection(alternativaList);

e tah dando essa execao

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: dominio.Alternativa; nested exception is java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: dominio.Alternativa

alguem me ajuda por favor!!

valeu!

luisweirich

Tente mudar o seu for conforme abaixo:

QuestaoFacade questaoFacade = (QuestaoFacade) context.getBean("questaoFacade");  
Questao questao = (Questao) context.getBean("questao");  
  
  
ArrayList <Alternativa> alternativaList = new ArrayList<Alternativa>();  
int index = listModelAlternativa.getSize();  

for(Alternativa alt : listModelAlternativa)
{
  alt.setQuestao(questao);
  alternativaList.add(alt); 
}

questao.setDescQuestao(txtQuestao.getText());  
questao.setAlternativaCollection(alternativaList);
renato_ramos

não funciona

foreach not applicable for expression type … é oque aparece =/

renato_ramos

Consegui ^^’

era o cascade que estava errado… podem me xingar auhahuuah… o mais obvio…

vo postar o codigo derepent alguem precisa

public void SalvarQuestao()
    {
        QuestaoFacade questaoFacade = (QuestaoFacade) context.getBean("questaoFacade");
        Questao questao = (Questao) context.getBean("questao");
        ArrayList <Alternativa> alternativaList = new ArrayList<Alternativa>();
        
        questao.setDescQuestao(txtQuestao.getText());
        questao.setAlternativaCollection(alternativaList);
        int index = listModelAlternativa.getSize();
        
        for(int i = 0; i < index  ; i++)
        {
            Alternativa alternativa = new Alternativa();
            alternativa = (Alternativa) listModelAlternativa.getElementAt(i);
            alternativa.setIdQuestao(questao);
            alternativaList.add(alternativa);
            
        }

        try {
            questaoFacade.gravar(questao);
            JOptionPane.showMessageDialog(null, "Registro salvo com sucesso!");
            txtAlternativaQuestao.setText(null);
            txtQuestao.setText(null);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Registro não foi salvo com sucesso!" + e.getMessage());
            txtAlternativaQuestao.setText(null);
            txtQuestao.setText(null);
        }

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

mt obrigado por terem me ajudado!

abraços!

Criado 4 de novembro de 2009
Ultima resposta 4 de nov. de 2009
Respostas 7
Participantes 4