Vraptor + Hibernate fk null

11 respostas
C

Olá pessoal

Pesquisei mas conseguir resolver um problema.

Quero inserir um registro onde sua fk pode ser null ou não ex. (Produto e receita - um produto pode conter uma receita ou não)

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.caelum.brvarejo.produto.Receita

Como posso resolver essa situação? Vlw

11 Respostas

G

Poste aqui apenas o form do seu JSP e também o método do seu controller que recebe esses dados do form.

Pela exception você está fazendo algo como:

Produto produto = new Produto(); produto.setXXX(blah); produto.setReceita(new Receita());

Quando deveria ser

Produto produto = new Produto(); produto.setXXX(blah); produto.setReceita(null);

C

garcia-jj:
Poste aqui apenas o form do seu JSP e também o método do seu controller que recebe esses dados do form.

Pela exception você está fazendo algo como:

Produto produto = new Produto(); produto.setXXX(blah); produto.setReceita(new Receita());

Quando deveria ser

Produto produto = new Produto(); produto.setXXX(blah); produto.setReceita(null);

form

<td>RECEITA:</td>
      <td>
        <input name="produto.receita.codReceita" type="text" id="codFigFiscal" class="ui-widget-content" size="10" maxlength="10" value="${produto.receita.codReceita}"/>
        <a href="#dialog3" id="dialog_link3" class="icons ui-state-default ui-corner-all"><span class="ui-icon ui-icon-search"></span></a>
      </td>

controller

public void adiciona(final Produto produto) {
		produtodao.salva(produto);
}
G

Como está sua entidade Produto? Em algum momento ela faz new Receita?

C
@ManyToOne
	private Receita receita;
G

cleison, sem você passar todas as informações não tem como te ajudar. Você terá que ver se em alguma parte do seu código em algum momento é feita uma instanciação vazia.

Esse erro dá quando você tenta, por exemplo, salvar um projeto com um objeto receita vazio. Da forma que está seu form aparentemente não tem nada de errado.

C

garcia-jj:
cleison, sem você passar todas as informações não tem como te ajudar. Você terá que ver se em alguma parte do seu código em algum momento é feita uma instanciação vazia.

Esse erro dá quando você tenta, por exemplo, salvar um projeto com um objeto receita vazio. Da forma que está seu form aparentemente não tem nada de errado.

Correto.

No form Produto terá codigo da receita que poderá setar esso ou não. Esse erro é referente a isso.
Gostaria de saber o que fazer para passar null na fk.

Que informação necessita mais?.

vlw

G

Poste aqui as classes envolvidas no processo, exemplo, o controller, a dao…

C

Vlw Garcia
Conseguir resolver, mas não sei se eh a melhor pratica.

Como estava setando o valor 0 estava dando erro pq tem q ser null.

No meu controller adicionei as seguintes linhas antes de salvar.

if (produto.getReceita().getCodReceita()== 0){
                produto.setReceita(null);
                }
C

cleison:
Vlw Garcia
Conseguir resolver, mas não sei se eh a melhor pratica.

Como estava setando o valor 0 estava dando erro pq tem q ser null.

No meu controller adicionei as seguintes linhas antes de salvar.

if (produto.getReceita().getCodReceita()== 0){
                produto.setReceita(null);
                }

Aproveitando esse topico gostaria de tirar uma outra duvida do mesmo seguimento do titulo

Como faço para validar um form quando a foreign key não existe?

G

Você quer dizer verificar, por exemplo, se tal receita existe no banco antes de associar a um produto?

Eu normalmente faço antes um find para ver se existe. Caso não existir faço um IlegalStateException.

Lucas_Cavalcanti

pra fazer a validação do lado do cliente vc vai precisar fazer uma requisição ajax pra uma lógica que verifica isso…
alguns plugins te ajudam, como o JQuery Validator

fazer do lado do servidor é só fazer um findById mesmo e ver se vem diferente de null

Criado 16 de outubro de 2010
Ultima resposta 17 de out. de 2010
Respostas 11
Participantes 3