1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Salvando lista filha com id do pai nulo - HIbernate

Galera,

Estou com uma dúvida sobre como salvar uma lista associada num mesmo session.persist().

Meu modelo está assim:

@javax.persistence.Entity
@Table(name = "questoes")
@Inheritance(strategy = InheritanceType.JOINED)
@AttributeOverride(name = "id", column = @Column(name = "questao_id"))
public class Questao extends Entity {

    @Column
    private String titulo;
    @Column
    private Double valor;

    @Enumerated(EnumType.ORDINAL)
    @NotNull
    private TipoQuestao tipoQuestao;

    @ManyToOne
    @JoinColumn(name = "assunto_id")
    private Assunto assunto;

    //getters and setters

}

E a especialização de Questao chamada QuestaoCertoErrado:

@Entity
@Table(name = "questao_certo_errado")
@PrimaryKeyJoinColumn(name = "questao_id")
@AttributeOverride(name = "id", column = @Column(name = "questao_ce_id"))
public class QuestaoCertoErrado extends Questao {

    private Integer numeroAlternativas;

    @OneToMany(mappedBy = "qstCertoErrado", targetEntity = Alternativa.class, cascade = CascadeType.ALL)
    private List<Alternativa> alternativas;

    public QuestaoCertoErrado() {
        this.numeroAlternativas = new Integer(2);
    }

    //getters and setters

}
@javax.persistence.Entity
@Table(name = "alternativas")
public class Alternativa extends Entity {

    private String descricao;
    private String feedback;
    private Boolean correto;
    private Double porcentagemAcerto;

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name = "questao_ce_id")
    private QuestaoCertoErrado qstCertoErrado;

    //getters and setters

}

Meu JSP está assim:

<c:forEach  var="i" begin="0" end="${questao.numeroAlternativas - 1 }">
    <div class="row-fluid gridCode">
            <div class="span2">
                <fmt:message key="alternativa.feedback"/> 
            </div>

            <div class="span7">
                <textarea style="margin: 0px; width: 100%; height: 60px;" name="questao.alternativas[${i }].feedback">${alternativa.feedback }</textarea>
            </div>

            <div class="span3">
                <label class="checkbox">
                    <input type="checkbox" name="questao.alternativas[${i }].correto"> <fmt:message key="alternativa.correto"/>
                </label>
                <div class="controls">
                    <input class="span3" name="questao.alternativas[${i }].porcentagemAcerto" type="text" id="inputEmail" value="${alternativa.porcentagemAcerto }" > <fmt:message key="alternativa.porcentagemAcerto" />
                </div>
            </div>
        </div>
</c:forEach>

E meu controller:

@Post("/questoes/tipoacertoerrado")
    public void createTipoCertoErrado(QuestaoCertoErrado questao) {
        validator.validate(questao);
        validator.onErrorUsePageOf(this).newTipoCertoErrado();
        questaoCERepository.create(questao); //Na prática aqui faz um session.persist() ;
        result.redirectTo(this).index();
}

Do jeito que está, esta salvando a Questao.java, QuestaoCertoErrado.java e a Alternativa.java é salva sem fazer referencia ao qstCertoErrado portanto no banco esta propriedade é salva como null.

Ainda não consegui enxergar o erro.

  • Na classe "Alternativa" tenta coloca dentro do @ManyToOne cascade=CascadeType.PERSIST do javax.persistence

    Mickdark   18 de jun de 2013
  • Não funciona do mesmo jeito.

    pvrsouza   18 de jun de 2013
  • Como é uma lista vc pode tentar por merge, mas dai vc vai precisar colocar os mapeamentos de cascateamento para mergear e do que vc quer que ele faça no merge (Update, Delete[Remove], Save[Persist]) o que vc não quiser que ele faça é só não colocar

    Mickdark   18 de jun de 2013
  • Não funcionou tb.

    pvrsouza   18 de jun de 2013
  • Você setou o QstCertoErrado na alternativa? alternativa.setQstCertoErrado(qstCertoErrado);, o Hibernate não cria esse relacionamento sozinho.

    Rodrigo Sasaki   18 de jun de 2013
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags hibernate java vraptor ou faça a sua própria pergunta.