- Descrição do Erro
- Solução
- 1) A Entidade que está sendo mapeada não possui a annotation javax.persistence.@Entity. Assim é necessário adicionar essa annotation a sua classe Java, como mostra o código abaixo:
- 2) A Entidade que está sendo mapeada não foi adicionada ao Arquivo hibernate.cfg.xml. Assim é necessário abrir esse arquivo e inserir a entidade com uma tag mapping, como mostra o código abaixo:
- 3) A classe Java foi annotada com @Entity e também foi adicionada ao arquivo hibernate.cfg.xml. Você pode ter errado o import!
- finally{
Olá Pessoal, tudo bom?
Hoje iremos falar sobre erro de Mapeamento de Entidades JPA, mais especificamente da exception Unknown entity.
Descrição do Erro
Ao mapear entidades via JPA para realizar a comunicação entre um banco de dados e o Java nós utilizamos a annotation @Entity para indicar ao JPA que esta entidade reflete uma tabela do banco de dados.
Se caso você mapeou a entidade e ocorreu um erro com a seguinte stack trace:
br.pucpr.bsi.prog6.ticketsEventosBSI.exception.BSIException: org.hibernate.MappingException: Unknown entity: br.pucpr.bsi.prog6.ticketsEventosBSI.model.Artista
at br.pucpr.bsi.prog6.ticketsEventosBSI.dao.PatternDAO.insert(PatternDAO.java:96)
at br.pucpr.bsi.prog6.ticketsEventosBSI.bc.ArtistaBC.insert(ArtistaBC.java:29)
at br.pucpr.bsi.prog6.ticketsEventosBSI.tests.laboratorioBC.TesteArtistaBC.criar(TesteArtistaBC.java:39)
at br.pucpr.bsi.prog6.ticketsEventosBSI.tests.laboratorioDAO.modification.TesteArtistaDAOModification.criar(TesteArtistaDAOModification.java:59)
… 28 more
Solução
Existem 3 possíveis soluções para essa exceção:
1) A Entidade que está sendo mapeada não possui a annotation javax.persistence.@Entity. Assim é necessário adicionar essa annotation a sua classe Java, 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 |
package br.com.mauda.example.model; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Artista implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY) private Long id; private String nome; //outros atributos, métodos e construtores } |
2) A Entidade que está sendo mapeada não foi adicionada ao Arquivo hibernate.cfg.xml. Assim é necessário abrir esse arquivo e inserir a entidade com uma tag mapping, 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 |
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.url">jdbc:hsqldb:hsql://localhost/myServerDB</property> <property name="hibernate.connection.username">sa</property> <property name="hibernate.connection.password"></property> <property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property> <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.hbm2ddl.auto">true</property> <property name="hibernate.connection.pool_size">10</property> <!-- Mapping files --> <mapping class="br.pucpr.bsi.prog6.ticketsEventosBSI.model.Ambiente"/> <mapping class="br.pucpr.bsi.prog6.ticketsEventosBSI.model.Artista"/> </session-factory> </hibernate-configuration> |
3) A classe Java foi annotada com @Entity e também foi adicionada ao arquivo hibernate.cfg.xml. Você pode ter errado o import!
Existem duas anotações @Entity ao trabalhar com JPA + Hibernate. A primeira, que surgiu antes quando não havia a especificação JPA, é a org.hibernate.annotations.Entity e a segunda javax.persistence.Entity, que está dentro da especificação JPA. Ao importar a annotation do Hibernate, ocorrerá a unknownException acima. Assim é necessário importar a anotação do JPA para que o erro não ocorra, 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 |
package br.com.mauda.example.model; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; //import org.hibernate.annotations.Entity; @Entity public class Artista implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY) private Long id; private String nome; //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!
Gabriel Guedes says
Artigo perfeito!
Muito obrigado!!!
Mauda says
Olá Gabriel, tudo bom?
Obrigado pelo feedback!
Precisando estamos aqui!
Abs.
Mauda
Eduardo Gomes says
Olá Mauda!
Post muito bom!
Eu estou com essa mensagem, mas mesmo após seguir suas recomendações o problema persiste.
mar 17, 2016 4:59:44 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory
INFO: HHH000397: Using ASTQueryTranslatorFactory
Exception in thread “main” org.hibernate.MappingException: Unknown entity: java.lang.String
at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:1096)
at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1479)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:117)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209)
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194)
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702)
at teste.Teste.main(Teste.java:21)
Mauda says
Olá Eduardo, tudo bom?
Obrigado pelo feedback!
Você poderia me fornecer mais informações como o que vc está tentando mapear e um código do que você está tentando fazer que gera o erro.
Pois somente essa stack é mais complicada de entender.
Se for o caso me mande um email mauda@mauda.com.br
Obrigado.
Mauda
Elton says
Não estou conseguindo e to recebendo esse mesmo erro também, esse é o codigo: github.com/eltonsantos/embeddedClasses
Pode me ajudar? Eu segui exatamente o q c disse pra tentar remover os erros.
Mauda says
Olá Elton, tudo bom?
Me envie a stack trace que está acontecendo o erro, pois preciso saber qual classe está com problema.
Obrigado.
Mauda says
Pelo que entendi rapidamente do seu código vc está tentando utilizar a Endereco (Entidade dependente) dentro Usuario (Entidade progenitora), mas para utilizar o @Embeddable ou @Embedded você deve ter apenas uma tabela que contemple ambas as classes, ok?
Existem duas formas de mapeamento para esse caso:
A primeira é utilizar somente @Embeddable
– Na entidade progenitora, deverá ser removido o mapeamento @OneToOne do atributo que referencia a classe dependente
– A entidade dependente será mapeada com a annotation @Embeddable ao invés de @Entity
A segunda é utilizar somente @Embedded
– Na entidade progenitora, deverá ser removido o mapeamento @OneToOne do atributo que referencia a classe dependente e acrescentado a annotation @Embedded
– Remover da entidade dependente a annotation @Entity
Para ambas as formas de mapear você deverá fazer:
– Além disso deverá ser removido o atributo id da entidade dependente
– A entidade dependente deverá ser removida do persistence.xml ou hibernate_cfg.xml
Tente esses passos e qualquer coisa mande a stack trace do código.
Obrigado.
Elton Melo dos Santos says
Obrigado pela resposta meu amigo, eu consegui resolver esse problema, mas gerou um ainda pior, mas nao é nada referente a seu blog ou tutorial, é apenas pra aprendizado esse meu projetinho. Vc nao precisa responder se nao quiser, é sobre passar parametros, nao consigo de forma alguma, toda vez que tento vem null, se vc olhar na index do meu projeto: github.com/eltonsantos/embeddedClasses
E dps a forma com que eu pego eles em endereco.xhtml verá que parece ta tudo correto, existe algum detalhe q nao estou me tocando e ja nem sei o que fazer, ja busquei tutoriais, amigos, colegas, ninguem ajuda. Ou mandam eu estudar (como se nao tivesse fazendo) ou mandam eu resolver so… Enfim, eh osso isso.
Mauda says
Olá Elton, tudo bom?
Me explique com mais detalhes, falando quais linhas de código e qual é o stack q está sendo lançado pelo Java que posso talvez te ajudar. Somente com essas informações que você informou, não dá para ter idéias por onde começar a procurar pra te ajudar, então me explicando melhor pode ser algo para ajudar a começar a avaliar seu código.
Obrigado.
Elton says
Na verdade, toda vez que entro em contato ctg eu resolvo um problema e acaba surgindo um maior kkkkk. Bom, sobre a passagem de parametros eu meio que “deixei pra lá”, eu estou com um forte e grave problema em fazer um relacionamento um pra um, sim eu sei q eh simples, mas eu sou noobÃO e eu preciso fazer isso, fui meio que intimado aqui no trabalho e ta osso, não da pra passar a missão pra outra pessoa e nem esperar um ano pra ser fera em java pra fazer isso. Eu preciso fazer um sistema aqui, mas pra nao subir o sistema no git, eu fiz algo bem parecido com o que quero, abstraindo muita coisa e deixando somente o que importa pra eu aprender como fazer. Ai eu criei o repositorio: github.com/eltonsantos/embeddedClasses
Aqui tem usuario e endereco, sao duas entidades, que fazem um relacionamento one-to-one. To usando JSF, JPA. O problema é o seguinte, nao ta dando erro, faço a inserção de Usuario primeiro ok, porém quando vou fazer a inserção de Endereço ele também faz, porém o usuario_id vem vazio e ai ele não reconhece da forma que quero o relacionamento. E isso envolve passagem de parametro que vem vazio e no banco salva tudo, menos o usuário_id. E eu queria saber onde ta o problema, mas em todos os tutoriais que já assisti não encontro isso 🙁
Mauda says
Olá Elton, tudo bom?
O problema principal que estou percebendo aqui é foco. Primeiro se desesperar não vai adiantar. Vc precisa ter a visão do seu negocio em primeiro lugar. Como será a forma de relacionamento entre endereço e pessoa? Outras classes poderão utilizar de endereço? Se for será uma associação unidirecional. O aspecto que eu focaria em primeiro lugar eh a estruturação com orientação a objetos das minhas classes que representam o meu negócio, mas conhecido como classes de domínio. Para isso diagrama de classe uml vai te ajudar e muito. Depois disso começamos a parte de mapeamento dessas entidades com tabelas do banco de dados e por fin, quando as inserções, updates, selects estiverem funcionando me preocuparia com a tela. Fazendo dessa forma você não se quebra em tentar aprender tudo ao mesmo tempo e vai construindo o software entendendo cada parte. Uma dica para a parte visual procure a biblioteca primefaces, tem mais de 100 componentes a sua disposição. Obrigado.
cesar paim says
ajudou bastante aqui…Parabéns!!!
Mauda says
Olá Cesar, tudo bom?
Obrigado pelo feedback!
Precisando estamos aqui.