[RESOLVIDO][Hibernate] - Field 'id' doesn't have a default value

Olá,

Tenho algumas entidades que se relacionam por 1:N e N:1. Quando vou salvar no banco de dados, o Hibernate lança a seguinte exceção:

Caused by: java.sql.SQLException: Field 'catVerb_id' doesn't have a default value

Procurei em outros tópicos e as recomendações se resumem a verificar se, no banco de dados, o id está marcado como AUTO_INCREMENT. O problema é que o meu já está e, mesmo assim, a exceção continua sendo lançada. Temo que seja algo relacionado ao teste que estou fazendo, mas, antes, gostaria de saber se há algo errado na implementação das classes. Portanto, aqui vão elas:

CategoriaVerbete

@Entity
@Table(name="verbete_categoria")
public class CategoriaVerbete implements Serializable{
    private long id;
    private String nome;
    private String descricao;
    private int serie;
    private Set<Verbete> verbetes = new HashSet<Verbete>();
    private Set<SignificadosVerbete> significados = new HashSet<SignificadosVerbete>();
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="catVerb_id")
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    
    ...

    @OneToMany(cascade = {CascadeType.ALL})
    @JoinColumn(name="catVerb_id", nullable = true) //chave estrangeira na tabela Verbete!
    public Set<Verbete> getVerbetes() {
        return verbetes;
    }
    public void setVerbetes(Set<Verbete> verbetes) {
        this.verbetes = verbetes;
    }

    @OneToMany(cascade = {CascadeType.ALL})
    @JoinColumn(name="catVerb_id", nullable = true)
    public Set<SignificadosVerbete> getSignificados() {
        return significados;
    }
    public void setSignificados(Set<SignificadosVerbete> significados) {
        this.significados = significados;
    }
    
}

Verbete

@Entity
@Table(name="verbete")
public class Verbete implements Serializable{
   ...
    
    @ManyToOne
    @JoinColumn(name="catVerb_id", insertable = false, updatable = false)
    public CategoriaVerbete getCategoria() {
        return categoria;
    }
    public void setCategoria(CategoriaVerbete categoria) {
        this.categoria = categoria;
    }
    
    ...
}

SignificadosVerbete

@Entity
@Table(name="verbete_significados")
public class SignificadosVerbete {
    ... 

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="catVerb_id", insertable = false, updatable = false)
    public CategoriaVerbete getCategoria() {
        return categoria;
    }
    public void setCategoria(CategoriaVerbete categoria) {
        this.categoria = categoria;
    }

   ...
    
}

No banco de dados…

CREATE TABLE verbete_categoria (
catVerb_id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
catVerb_nome VARCHAR(100) UNIQUE,
catVerb_descricao MEDIUMTEXT,
catVerb_serie INT NOT NULL
);

Se for necessário o arquivo de testes, avisem, por favor.

Agradeço toda ajuda desde já.

Qual a query gerada pelo hibernate, para o insert?

Aparece esta:

Deixa eu colar aqui o teste que estou fazendo, talvez seja algo nele…

        Verbete verbete = new Verbete();
        verbete.setAutor(usuarioService.buscarUsuarioPorLogin("greati"));
        CategoriaVerbete categoria = verbeteService.listarCategoriasPorSerie(1).get(0);
        verbete.setCategoria(categoria);
        verbete.setEtimologia("essa é a etimologia");
        verbete.setDataLancamento(new Date());
        
        List<NomesVerbete> nomes = new ArrayList<NomesVerbete>();
        NomesVerbete nome = new NomesVerbete();
        nome.setVerbete(verbete);
        nome.setNome("glicose");
        nomes.add(nome);
        
        verbete.setRelevancia(5);
        verbete.setTotalAcessos(0);
        
        SignificadosVerbete significado = new SignificadosVerbete();
        significado.setSignificado("Signfiicaiasij aisjaisjai aisjaijaisjiajsis sias");
        significado.setVerbete(verbete);
        significado.setCategoria(categoria);
        List<SignificadosVerbete> significados = new ArrayList<SignificadosVerbete>();
        significados.add(significado);
        //verbete.set
        verbeteService.addVerbete(verbete, nomes, significados);

Veja que eu já tenho um usuário no banco e uma categoria também.
Os nomes e significados estou criando na hora aí e salvando pelo service do verbete, mas acho que essa parte não tem muita importância.

Alguém já passou por erro semelhante? O que eu postei não é suficiente para entender o problema?

Camarada, entender o problema, provavelmente o pessoal entendeu. O que está causando demora na resposta é encontrar fundamento para que a falha ocorra.
Você tentou inserir na mão algum registro no banco, para ver se ocorre o mesmo?

Agradeço as respostas :slight_smile:

À mão, direto no banco, funciona. O problema ou é com o mapeamento ou é com o teste…

Bom, percebi que, se tirar a definição NOT NULL da FK lá no banco de dados, eu consigo dar o insert pelo update, porém não ocorre o relacionamento, ou seja, eu não estou conseguindo fazer com que a primary key de um passe para a FK do outro.

O problema, então, ou é no mapeamento ou é no teste.

Alguém poderia, se possível:

a) verificar se meu mapeamento está correto
b) e mostrar como se faz o teste para entidades relacionadas via 1:N

Muito agradecido desde já.

Gostaria de uma trilha sonora triunfal agora, mas tudo bem…

RESOLUÇÃO DO PROBLEMA:

Basta seguir, passo a passo, as explicações presentes neste link:

https://www.ibm.com/developerworks/community/blogs/fd26864d-cb41-49cf-b719-d89c6b072893/entry/como_criar_relacionamento_onetomany_com_hibernate?lang=en

Li em um artigo que as soluções desse link não eram recomendadas pela documentação do Hibernate, mas segui o que foi recomendado e perdi uma semana com erros.

Então, fica aí para quem tiver o mesmo problema.

Agradeço as respostas e bons ares para todos.

1 curtida