Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Erro Hibernate ao salvar com chave estrangeira - Usando Primefaces

Estou tendo problemas ao salvar usando Hibernate com chave estrangeira não obrigatória. tentei alterar, porém o erro persiste. Se alguem puder ajudar agradeço. Para desktop não tenho este problema mas quando estou migrando para web fica dando este erro.
O banco de dados é MySQL, HIbernate 3.0;
Muito obrigado.
erro:

javax.faces.FacesException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.project.model.classes.sisprev.TipoDeSeguimento
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:89)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)

classe de entidade preciso que aceite null

@ForeignKey(name = "fk_tipo_seguimento_contas_b")
    @JoinColumn(name = "ID_TIPO_seguimento", referencedColumnName = "ID_TIPO", nullable = true)
    @ManyToOne(optional=true)
    private TipoDeSeguimento tipoDeSeguimento = new TipoDeSeguimento();

método de salvar

@Override
    public void saveOrUpdate(T obj) throws Exception {
        validaSessionFactory();
        sessionFactory.getCurrentSession().saveOrUpdate(obj);
        executeFlushSession();
    }
2 respostas
solução!

Olá Themer!

Pelo que você descreveu, parece que o problema está relacionado ao Hibernate tentando salvar uma instância transiente de TipoDeSeguimento que ainda não foi persistida no banco de dados. Isso acontece quando você cria uma nova instância de TipoDeSeguimento e a associa ao seu objeto principal, mas não a salva antes de tentar salvar o objeto principal.

O que você pode fazer:

  1. Verifique a Instância de TipoDeSeguimento: Certifique-se de que a instância de TipoDeSeguimento que você está associando ao seu objeto principal já está salva no banco de dados. Se não for o caso, você precisa persistir essa instância antes de associá-la.

  2. Salvar TipoDeSeguimento Separadamente: Antes de salvar o objeto principal, salve a instância de TipoDeSeguimento separadamente, se ela for nova. Você pode fazer isso chamando saveOrUpdate para a instância de TipoDeSeguimento antes de salvar o objeto principal.

    if (obj.getTipoDeSeguimento() != null && obj.getTipoDeSeguimento().getId() == null) {
        sessionFactory.getCurrentSession().saveOrUpdate(obj.getTipoDeSeguimento());
    }
    sessionFactory.getCurrentSession().saveOrUpdate(obj);
    
  3. Verifique o Mapeamento: Certifique-se de que o mapeamento da entidade TipoDeSeguimento está correto e que não há restrições que impeçam que null seja aceito, já que você mencionou que a chave estrangeira não é obrigatória.

  4. Inicialização da Instância: No seu código, você está inicializando tipoDeSeguimento com new TipoDeSeguimento(). Se tipoDeSeguimento pode ser null, talvez seja melhor inicializá-lo como null para evitar que o Hibernate tente persistir uma instância não necessária.

Espero que essas dicas ajudem a resolver o seu problema. Conte com nosso apoio!

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado

Obrigado, quando você disse sobre TipoDeSeguimento (maíusculo) percebi que eu estava fazendo um new TipoDeSeguimento por isso estava dando problema.
Eu achei estranho pois tenho está mesma classe de entidade no desenvolvimento desktop.

eu só fiz isso aqui caso alguém tenha este tipo de problema no futuro.

    @ForeignKey(name = "fk_tipo_seguimento_contas_b")
    @JoinColumn(name = "ID_TIPO_seguimento", referencedColumnName = "ID_TIPO", nullable = true)
    @ManyToOne(optional=true)
    private TipoDeSeguimento tipoDeSeguimento;

Não precisa deste código não pois o tipo de seguimento já existe, porém ele não seria usado pois não seria utilizado devido ao tipo de conta bancária.

if (obj.getTipoDeSeguimento() != null && obj.getTipoDeSeguimento().getId() == null) {
    sessionFactory.getCurrentSession().saveOrUpdate(obj.getTipoDeSeguimento());
}
sessionFactory.getCurrentSession().saveOrUpdate(obj);