Olá Pessoal, tudo bom?
Hoje iremos falar sobre um erro de Mapeamento de Entidades JPA, mais especificamente da exception org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: ClasseDestino.nameMappedBy in ClasseOrigem.attribute.
Descrição do Erro
Ao mapear um atributo de uma entidade JPA, utilizando-se o mappedBy, deve ser inserido o nome do atributo da classe mapeada corretamente. Por exemplo, verifique 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 26 27 28 29 |
package br.com.mauda.example.model; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; @Entity public class Artista implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nome; @OneToMany(mappedBy = "artistas") private List<Musica> musicas = new ArrayList<Musica>(); public Artista(){ } //outros atributos, métodos e construtores } |
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 } |
Se o mapeamento foi feito dessa forma ocorrerá um erro com a seguinte stack trace:
org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: ClasseDestino.artistas in ClasseOrigem.musicas
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:709)
at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:669)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:69)
at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1639)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1393)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1784)
Solução
Para corrigir essa exception deve-se modificar o valor que se encontra no element mappedBy da Entidade Origem (no exemplo, Artista).
Assim, no caso do exemplo, o nome do atributo na entidade Destino, Musica, é artista e não artistas, ao modificar o valor do mappedBy no atributo musicas da entidade Artista, será corrigido o problema, 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 26 27 28 29 |
package br.com.mauda.example.model; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; @Entity public class Artista implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nome; @OneToMany(mappedBy = "artista") private List<Musica> musicas = new ArrayList<Musica>(); public 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