Hibernate 5: – org.hibernate.MappingException: entidade desconhecida

Estou recebendo a mensagem de erro org.hibernate.MappingException: Unknown entity quando estou tentando integrar o hibernate 5.0 com o mysql

Isso parece ser um problema com o hibernate5.0.0 e 5.0.1. Isso funciona bem com o modo de hibernação 4.3.9

Maven dependices

  org.hibernate hibernate-core 5.0.0.Final   mysql mysql-connector-java 5.1.36  

hibernate.cfg.xml

   com.mysql.jdbc.Driver jdbc:mysql://localhost:3307/SampleDB  root   1 org.hibernate.dialect.MySQLDialect  true  create   

Código HibernateMain.java

 package UserA; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.mapping.Map; import org.hibernate.metadata.ClassMetadata; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.service.ServiceRegistry; public class HibernateMain { public static void main(String[] args) { Configuration configuration = new Configuration(); configuration.configure(); ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); SessionFactory sf = configuration.buildSessionFactory(sr); User user1 = new User(); user1.setUserName("Arpit"); user1.setUserMessage("Hello world from arpit"); user1.setUserId(22); Session ss = sf.openSession(); ss.beginTransaction(); // saving objects to session ss.save(user1); ss.getTransaction().commit(); ss.close(); } } 

User.java

 package UserA; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; @Entity(name="User_table") public class User { @Id int userId; @Column(name = "User_Name") String userName; @Column(name = "User_Message") String userMessage; public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserMessage() { return userMessage; } public void setUserMessage(String userMessage) { this.userMessage = userMessage; } } 

Eu corrigi o mesmo problema com o Hibernate 5. Há um problema neste código

 Configuration configuration = new Configuration(); configuration.configure(); ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings( configuration.getProperties()).build(); SessionFactory sf = configuration.buildSessionFactory(sr); 

Este código funciona bem para o Hibernate 4.3.5, mas o mesmo código tem o mesmo problema para o Hibernate 5.

Quando você faz o configuration.buildSessionFactory(sr) , usando o Hibernate 5, o Configuration perde toda a informação sobre o mapeamento que é obtido pela chamada configuration.configure() .

Solução

Para corrigir o problema, se você usar os arquivos de configuração padrão hibernate.cfg.xml e hibernate.properties , poderá criar o factory de session desta forma (sem ServiceRegistry )

 SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 

Carregando propriedades

Se você tem propriedades em um arquivo diferente do hibernate.properties , você pode construir o factory de session usando o StandardServiceRegistryBuilder (de qualquer maneira, se você tiver o hibernate.properties e outro arquivo, ele será carregado ambos)

Para carregar propriedades como um recurso

 ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder(). configure().loadProperties("hibernate-h2.properties").build(); SessionFactory sf = new Configuration().buildSessionFactory(serviceRegistry); 

Você precisa ter hibernate-h2.properties no caminho da class (raiz da pasta de fonts, pasta de resources). Você também pode especificar um caminho da pasta de origem raiz /com/github/xxx/model/hibernate-h2.properties .

Para carregar propriedades de um caminho no sistema de arquivos

 File propertiesPath = new File("some_path"); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder(). configure().loadProperties(propertiesPath).build(); SessionFactory sf = new Configuration().buildSessionFactory(serviceRegistry); 

Você pode encontrar um aplicativo de console de exemplo usando essa abordagem aqui fluent-hibernate-mysql . Ele usa uma class de utilitário para construir o factory de session a partir da biblioteca de hibernação fluente .

Tutorial incorreto do Hibernate 5

Há um exemplo incorreto no tutorial 1.1.6 do Hibernate 5 . Inicialização e ajudantes . Ele usa esse código

  return new Configuration().configure().buildSessionFactory( new StandardServiceRegistryBuilder().build() ); 

Não faz uma configuração adequada.

No Hibernate 5, você precisa construir StandardServiceRegistry e Metadata para construir SessionFactory . Você poderia usar o seguinte HibernateUtil para construir SessionFactory . hibernate.cfg.xml deve estar na raiz do classpath do seu aplicativo.

 public class HibernateUtil { private static final SessionFactory sessionFactory = buildSessionFactory(); private static SessionFactory buildSessionFactory() { try { // Create the SessionFactory from hibernate.cfg.xml StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder() .configure("hibernate.cfg.xml").build(); Metadata metadata = new MetadataSources(standardRegistry).getMetadataBuilder().build(); return metadata.getSessionFactoryBuilder().build(); } catch (Throwable ex) { // Make sure you log the exception, as it might be swallowed System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } 

Além disso, se você estiver usando o Hibernate 5 e usando @Id como sua estratégia de geração de identificadores, então usar GenerationType.AUTO irá pegar o gerador de identidade de “sequência” por padrão com o MySQL, que lhe dará o com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'SampleDB.hibernate_sequence' doesn't exist exceção, se você não tem configurado em suas entidades em atributos de identificador. Portanto, com o Hibernate 5, use GenerationType.IDENTITY .

Você não adicionou um arquivo de configuração

 configuration.configure("/hibernate.cfg.xml"); 

Certifique-se de ter criado o arquivo de mapeamento User.hbm.xml ou o arquivo User.xml e incluído esse arquivo no hibernate.cfg.xml

Usando isto:

 SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class); Session session = sessionFactory.openSession(); 

em vez disso:

 SessionFactory factory = new Configuration().configure().buildSessionFactory(); Session session = factory.openSession(); 

resolveu o problema com o Hibernate 5.2.10.Final.

Eu estava enfrentando o mesmo problema e eu procurei por quase 2 horas e tentei com diferentes maneiras possíveis, como replace antigos flasks de hibernação e mudar o esquema da tabela de database. Mas finalmente consegui a solução como abaixo;

  //This line to be replaced with below commented line SessionFactory factory = new Configuration().configure().buildSessionFactory(); 

Substituir acima por

 Configuration config = new Configuration().configure(); ServiceRegistry servReg = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build(); SessionFactory factory = config.buildSessionFactory(servReg); 

Então vai funcionar bem ..