Olá Pessoal, tudo bom?
Hoje iremos falar sobre um erro de Mapeamento de Entidades JPA, mais especificamente da exception org.hibernate.HibernateException: Missing column: NomeColuna in NomeTabela
Descrição do Erro
Esse é um erro muito comum de acontecer ao trabalhar com o mapeamento das colunas de uma tabela do banco de dados. O JPA por default usa o nome do atributo para verificar se há uma coluna no banco de dados com o mesmo nome. Caso os nomes do atributo e coluna sejam iguais, independente das letras serem minúsculas ou maiúsculas, não ocorrerá erro; mas caso sejam diferentes e não for utilizado a annotation javax.persistence.@Column ou a javax.persistence.@JoinColumn se caso for uma associação @OneToOne ou @ManyToOne ocorrerá a exception descrita acima.
Para o caso acima ocorrerá um erro com uma stack trace parecida:
org.hibernate.HibernateException: Missing column: NomeColuna in NomeTabela
at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1302)
at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:155)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:512)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1797)
at br.com.mauda.seminariosCientificos.dao.util.HibernateUtil.getSessionFactory(HibernateUtil.java:23)
… 35 more
Solução 1
O primeiro ponto a ser verificado é se a coluna que você deseja mapear EXISTE no banco de dados. Se não haver uma coluna com o mesmo nome da classe, por exemplo, NOME, o hibernate dará esse erro. Então a primeira solução é criar uma coluna com o mesmo nome do atributo. Se caso não for possível criar uma coluna, ou ela existe com outro nome, favor ver a solução 2.
Solução 2
A solução para este erro, quando for um atributo simples, é inserir a annotation javax.persistence.@Column sobre o atributo. Essa annotation deve estar com o atributo name preenchido com o nome da coluna do banco de dados, como mostra o código abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package br.com.mauda.example.model; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="TB_ARTISTA") public class Artista implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY) private Long id; @Column(name="TX_NOME") private String nome; //outros atributos, métodos e construtores } |
Solução 3
Outra solução para este erro, quando for uma associação @OneToOne ou @ManyToOne é inserir a annotation javax.persistence.@JoinColumn sobre o atributo. Essa annotation deve estar com o atributo name preenchido com o nome da coluna do banco de dados que indica a Chave Estrangeira da tabela, como mostra o código abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package br.com.mauda.example.model; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Musica implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nome; @ManyToOne @JoinColumn(name="ID_ARTISTA") private Artista artista; //outros atributos, métodos e construtores } |
finally{
Caso você achou mais alguma solução para essa exception, por favor deixe nos comentários abaixo!
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leave a Reply