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

Autocomplete com SelectEvent retorna objeto null

Estou usando o autocomplete e quando insiro um campo, ele preenche sozinho outros dois campos. Porém esses dois objetos desses campos estão ficando null na hora de gravar.

O autocomplete

<p:outputLabel value="Título da Monografia: " for="tituloMonografia" />
                    <p:autoComplete id="tituloMonografia" size="100"
                        value="#{gestaoBancaDefesaBean.bancaDefesa.monografia}"
                        completeMethod="#{gestaoBancaDefesaBean.completarMonografia}"
                        var="monografia" itemLabel="#{monografia.titulo}"
                        itemValue="#{monografia}" forceSelection="true" groupBy="titulo" >
                        <o:converter converterId="omnifaces.ListConverter" list="#{gestaoBancaDefesaBean.listaMonografias}" />
                        <p:ajax event="itemSelect"
                            listener="#{gestaoBancaDefesaBean.handleSelect}"
                            update="aluno" />
                        <p:ajax event="itemSelect"
                            listener="#{gestaoBancaDefesaBean.handleSelect}" update="orientador" />
                    </p:autoComplete>

O erro mostra que a coluna aluno_id é nula e não pode persistir.

Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
    at com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'aluno_id' cannot be null
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.Util.getInstance(Util.java:408)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2490)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
    at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079)
    at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013)
    at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204)
    ... 90 more
5 respostas

Fala ai Daniel, de boa ?

Cara, que bizarro. Parece que o id do seu aluno tá nulo, acho que você não está puxando essa informação corretamente :(

Fala ai Matheus blz! Cara eu acho que o problema está aqui:

<p:outputLabel value="Aluno: " for="aluno" />
                    <p:autoComplete id="aluno" size="40"
                        value="#{gestaoBancaDefesaBean.bancaDefesa.monografia.aluno}"                    
                        converter="omnifaces.SelectItemsConverter" var="aluno"
                        itemLabel="#{aluno.pessoa.nome}" itemValue="#{aluno}">
                    </p:autoComplete>

Porque esse é o campo da entidade de aluno que vai ser persistida. E no caso tem varios objetos nesse value, que é bancaDefesa>monografia>aluno>pessoa e nom fim o atributo nome.

O Método que faz o preenchimento automático do cmpo aluno e professor

 public void handleSelect(SelectEvent event) {

        this.monografia = (Monografia) event.getObject();

    }

O bean

@Named
@ViewScoped
public class GestaoBancaDefesaBean implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    private BancaDefesas bancaDefesas;

    @Inject
    private Professores professores;

    @Inject
    private Monografias monografias;

    @Inject
    private FacesMessages messages;

    @Inject
    private CadastroBancaDefesaService cadastroBancaDefesaService;

    private Converter monografiaConverter;

    private List<BancaDefesa> listaBancaDefesas;

    private List<Professor> listaProfessores;

    private List<Monografia> listaMonografias;

    private String termoPesquisa;

    private BancaDefesa bancaDefesa;

    private Aluno aluno;

    private Professor professor;

    private Monografia monografia;

    public void handleSelect(SelectEvent event) {

        this.monografia = (Monografia) event.getObject();

    }

    @PostConstruct
    private void iniciar() {

        bancaDefesa = new BancaDefesa();
        this.bancaDefesa.setMonografia(new Monografia());

        aluno = new Aluno();
        this.aluno.setPessoa(new Pessoa());

        professor = new Professor();
        this.professor.setPessoa(new Pessoa());

        listaProfessores = professores.todos();

        listaMonografias = monografias.todas();
    }

    public void prepararNovaBanca() {
        //bancaDefesa = new BancaDefesa();
        //this.bancaDefesa.setMonografia(new Monografia());
    }

    public void prepararEdicao() {

    }

    public void salvar() {
        cadastroBancaDefesaService.salvar(bancaDefesa);

        atualizarRegistros();

        messages.info("Banca salva com sucesso!");

        RequestContext.getCurrentInstance().update(Arrays.asList("frm:bancaDefesasDataTable", "frm:messages"));
    }

    public void pesquisar() {
        listaBancaDefesas = bancaDefesas.pesquisar(termoPesquisa);

        if (listaBancaDefesas.isEmpty()) {
            messages.info("Sua consulta não retornou registros.");
        }
    }

    public void todasBancaDefesas() {
        listaBancaDefesas = bancaDefesas.todas();
    }

    public List<Monografia> completarMonografia(String termo) {
        List<Monografia> listaMonografias = monografias.pesquisar(termo);

     monografiaConverter = new MonografiaConverter(listaMonografias);

         return listaMonografias;
     }

//gets e sets

O aluno está vindo corretamente ?

Sim está. Oque percebi é que parece que ele fica null antes de persistir. Também estou desconfiando desse método handleSelect(Select event), ele pode estar deixando null o objeto aluno

solução!

O problema foi que as duas tabelas que eu estava persisitindo, que eram BancaDefesa e Monografia, ambas tinham o atributo aluno, referenciando como chave estrangeira a tabela Aluno. Logo, isso estava causando problema pois ele estava buscando o atributo aluno_id da tabela BancaDefesa e não achava para persistir. Então a persistência ficando somente a cargo da tabela Monografia deu certo. Foi então um problema de relacionamento, então tirei o relacionamento da tabela BancaDefesa com a tabela Aluno