线程“main”中的exceptionorg.hibernate.MappingException:未知实体

在PluralSight上阅读“Hibernate简介”教程。 我有这个exception错误。 完整的错误是:

Exception in thread "main" org.hibernate.MappingException: Unknown entity: com.simpleprogrammer.User at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:776) at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1451) at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:100) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:678) at org.hibernate.internal.SessionImpl.save(SessionImpl.java:670) at org.hibernate.internal.SessionImpl.save(SessionImpl.java:665) at com.simpleprogrammer.Program.main(Program.java:15) 

不确定是什么问题。 我创建了User.java pojo。 我创建了一个与pojo匹配的表。 我创建了映射,然后将映射添加到hibernate.cfg.xml文件中。 但是,仍然得到错误。 谁能帮我解决这个问题?

的hibernate.cfg.xml

     com.mysql.jdbc.Driver jdbc:mysql://localhost:3306 root protein_tracker org.hibernate.dialect.MySQLDialect    

Program.java

 public class Program { public static void main(String[] args) { System.out.println("Hello World!"); Session session = HibernateUtilities.getSessionFactory().openSession(); session.beginTransaction(); User user = new User(); user.setName("Joe"); user.setGoal(250); session.save(user); session.getTransaction().commit(); session.close(); HibernateUtilities.getSessionFactory().close(); } } 

User.hbm.xml

                     

User.java

 package com.simpleprogrammer; public class User { private int id; private String name; private int total; private int goal; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public int getGoal() { return goal; } public void setGoal(int goal) { this.goal = goal; } } 

HibernateUtilities.java

 package com.simpleprogrammer; import org.hibernate.HibernateException; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; public class HibernateUtilities { private static SessionFactory sessionFactory; private static ServiceRegistry serviceRegistry; static { try { Configuration configuration = new Configuration().configure(); serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); } catch(HibernateException exception) { System.out.println("Problem creating session factory!"); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } 

LinhSaysHi,我用Hibernate 5执行了你的代码,我有完全相同的错误。 我用Hibernate 4执行它并没有问题。

关于Pluralsight的教程是为Hibernate 4创建的。这是一个与Hibernate 5一起使用的会话工厂构建器:

 public class HibernateUtilities_5 { private static final SessionFactory sessionFactory = buildSessionFactory(); private static SessionFactory buildSessionFactory() { try { StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder() .configure("hibernate.cfg.xml").build(); Metadata metadata = new MetadataSources(standardRegistry).getMetadataBuilder().build(); return metadata.getSessionFactoryBuilder().build(); } catch (HibernateException he) { System.out.println("Session Factory creation failure"); throw he; } } public static SessionFactory getSessionFactory() { return sessionFactory; } } 

在使用Hibernate 5.1.1进行尝试时,我也遇到了同样的错误。 但我通过用StandardServiceRegistryBuilder替换ServiceRegistry接口并使用“metadatasources”来创建会话工厂来解决它。 请参阅下面的代码

 static { try { //Configuration configuration = new Configuration().configure(); standardServiceRegistry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml") .build(); Metadata metadata = new MetadataSources(standardServiceRegistry) .getMetadataBuilder().build(); sessionFactory = metadata.getSessionFactoryBuilder().build(); }catch(HibernateException exception) { System.out.println("problem creating session factory!"); } } public static SessionFactory getSessionFactory(){ return sessionFactory; } 

我做了这些改变,它就像一个魅力。 请在代码中更改加载配置文件的方式并再次尝试。 如果你还面临障碍,请告诉我。

请检查您在MySQL中创建的模式名称以及hibernate.cfg文件中指定的模式名称。这对我来说是不匹配的,我遇到了同样的问题。

还要修改下面的连接URL,并从hibernate.cfg中删除默认架构字段。 JDBC:MySQL的://本地主机:3306 / protein_tracker

这对我有用。

我使用了你的例子,并且能够通过一些小的调整来实现它。

已validationUser.hbm.xml位于src / main / resources / com / simpleprogrammer中。 更改为小写table="users"

然后在hibernate.cfg.xml中:

  1. 从session-factory中删除了name=""属性。
  2. 添加了SomePassword
  3. 添加了create

根据Hibernate 5更改代码

  static { try { //Configuration configuration = new Configuration().configure(); serviceRegistry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml") .build(); Metadata metadata = new MetadataSources(serviceRegistry) .getMetadataBuilder().build(); sessionFactory = metadata.getSessionFactoryBuilder().build(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } public static SessionFactory getSessionFactory() { return sessionFactory; } 

在user.hbm.xml中给出完整的类路径

   

在hibernate.cfg.xml中映射资源

   

并执行以下代码

  Session session = HibernateUtilities.getSessionFactory().openSession(); session.beginTransaction(); Users user = new Users(); user.setuserName("Prince"); user.setGoal(100); user.setId(101); user.setTotal(10); session.save(user); session.getTransaction().commit(); session.close(); HibernateUtilities.getSessionFactory().close();