Object references an unsaved transient instance

Tenho um objeto Orcamento e dentro dele tem uma variavel do tipo Cliente, anotado com @ManyToOne
Olha só o erro que começou a dar ao salvar o orçamento:
[color=red]object references an unsaved transient instance - save the transient instance before flushing: beans.Orcamento.cliente -> beans.Cliente[/color]
Esse erro da tanto no inserir como no alterar, porém o objeto Cliente relacionado com esse Orcamento ja esta salvo no banco, com id e tudo setado no objeto…

Tenho que fazer o que pra salvar?

Aqui explica o problema e mostra como resolver: JPA: Mini Livro - Primeiros passos e conceitos detalhados.

pelo que entendi lendo seu artigo, deveria então usar um CascadeType.refresh no objeto filho dentro do objeto pai…
Pra que o hibernate atualize o objeto filho tornando-o persistente…
Porem ainda assim da o mesmo erro.

O que eu acho estranho é ter que ficar fazendo conexão desnecessaria com o banco pra tornar um objeto “persistente”(não-transiente) em todos os filhos pra poder salvar o pai…
Sendo que eu estou assumindo que os objetos filhos já existem no banco…

----------EDIT----------

Dando uma lida mais atenciosa, vi que é indicado o uso do método getReference pra adicionar um objeto dettached no contexto de persistencia…
Se entendi bem, preciso fazer isso em todos os objetos filhos que estão vinculados à um objeto pai na hora de salvar(desde que esses filhos já existam la no banco)? É isso mesmo?
Não tem como fazer isso via anotação, pra eu não precisar implementar isso nos meus crud?
Pois quando eu usava o hibernate via session ele fazia isso, agora que estou usando JPA com EntityManager vou ter que implementar isso e eu mesmo verificar se o objeto existe ou não…

[quote=mateusviccari]pelo que entendi lendo seu artigo, deveria então usar um CascadeType.refresh no objeto filho dentro do objeto pai…
Pra que o hibernate atualize o objeto filho tornando-o persistente…
Porem ainda assim da o mesmo erro.

O que eu acho estranho é ter que ficar fazendo conexão desnecessaria com o banco pra tornar um objeto “persistente”(não-transiente) em todos os filhos pra poder salvar o pai…
Sendo que eu estou assumindo que os objetos filhos já existem no banco…

----------EDIT----------

Dando uma lida mais atenciosa, vi que é indicado o uso do método getReference pra adicionar um objeto dettached no contexto de persistencia…
Se entendi bem, preciso fazer isso em todos os objetos filhos que estão vinculados à um objeto pai na hora de salvar(desde que esses filhos já existam la no banco)? É isso mesmo?
Não tem como fazer isso via anotação, pra eu não precisar implementar isso nos meus crud?
Pois quando eu usava o hibernate via session ele fazia isso, agora que estou usando JPA com EntityManager vou ter que implementar isso e eu mesmo verificar se o objeto existe ou não…[/quote]Se tem como eu não sei. =/
No caso da lista, eu fiz foi uma query trazendo todo mundo da lisa de uma vez só. Achei mais fácil.

Tive que fazer um método pra fazer isso ja que uso crud e Views genericos no meu sistema, então antes de dar um persist ou merge pra incluir ou atualizar um objeto, executo esse método passando como parametro meu objeto e minha entityManager:

public static void ressincronizarFilhos(Object o, EntityManager em){
        try{
            if(o==null){
                return;
            }
            Field[] fields = o.getClass().getDeclaredFields();
            lacoFields:for(Field field : fields){
                //só vai ressincronizar se o campo for um objeto que estiver no pacote beans
                if(field.getType().getPackage().getName().equals("beans")){
                    //e so vai fazer se ele nao tiver a anotação transient
                    Annotation[] anotacoes = field.getDeclaredAnnotations();
                    for(Annotation anotacao : anotacoes){
                        if(anotacao.getClass().equals(Transient.class)){
                            continue lacoFields;
                        }
                    }
                    //agora vai ressincronizar o campo
                    field.setAccessible(true);
                    Object bean = field.get(o);
                    try{
                        //pega o id do objeto filho e ressincroniza o objeto
                        Object id=ObterIdSerializable.obterIdSerializable(bean);
                        if(id!=null){
                            bean=em.getReference(field.getType(), id);
                            field.set(o, bean);
                        }
                    }catch(EntityNotFoundException e){
                        
                    }
                }else{
                    continue lacoFields;
                }
            }
        }catch(Exception e){
            FrameErroBasico feb=new FrameErroBasico(null, true);
            feb.setText("Não foi possível ressincronizar objetos", e);
            feb.setVisible(true);
        }
    }

Mas mesmo assim acredito que deve ter outro jeito, ou vai ver o pessoal que fez a JPA nao pensou muito bem na hora de fazer isso pois nao vejo explicação logica pra isso nao acontecer automaticamente.