hibernate5: – org.hibernate.MappingException:未知的实体
我得到的错误消息org.hibernate.MappingException: Unknown entity当我试图集成hibernate5.0与MySQL 
这似乎是hibernate5.0.0和5.0.1的一个问题。 这与hibernate4.3.9工作正常
Maven的依赖
 <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.0.0.Final</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.36</version> </dependency> 
的hibernate.cfg.xml
 <session-factory> <!-- Database connection settings --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3307/SampleDB </property> <property name="connection.username">root</property> <property name="connection.password"></property> <!-- JDBC connection pool (use the built-in) --> <property name="connection.pool_size">1</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">create</property> <mapping class="UserA.User"></mapping> </session-factory> 
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; } } 
	
我已经修复了与Hibernate 5相同的问题。这个代码有一个问题
 Configuration configuration = new Configuration(); configuration.configure(); ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings( configuration.getProperties()).build(); SessionFactory sf = configuration.buildSessionFactory(sr); 
这个代码对于Hibernate 4.3.5来说工作的很好,但是对于Hibernate 5来说,相同的代码也有相同的问题。
 当你使用Hibernate 5来执行configuration.buildSessionFactory(sr) , Configuration丢失关于通过调用configuration.configure()得到的映射的所有信息。 
解
 要解决这个问题,如果使用标准的configuration文件hibernate.cfg.xml和hibernate.properties ,可以通过这种方式创build会话工厂(没有ServiceRegistry ) 
 SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 
加载属性
 如果在hibernate.properties的文件中有属性,那么可以使用StandardServiceRegistryBuilder构build会话工厂(无论如何,如果您有hibernate.properties和其他文件,它们将同时加载) 
将属性作为资源加载
 ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder(). configure().loadProperties("hibernate-h2.properties").build(); SessionFactory sf = new Configuration().buildSessionFactory(serviceRegistry); 
 您需要在类path(源文件夹的根目录,资源文件夹)中有hibernate-h2.properties 。 您也可以从根源文件夹指定path/com/github/xxx/model/hibernate-h2.properties 。 
从文件系统中的path加载属性
 File propertiesPath = new File("some_path"); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder(). configure().loadProperties(propertiesPath).build(); SessionFactory sf = new Configuration().buildSessionFactory(serviceRegistry); 
你可以在这里find一个使用这个方法的示例控制台应用程序fluent-hibernate-mysql 。 它使用一个工具类从stream利的hibernate库build立会话工厂。
不正确的Hibernate 5教程
Hibernate 5教程1.1.6中有一个不正确的例子。 启动和帮手 。 它使用这个代码
  return new Configuration().configure().buildSessionFactory( new StandardServiceRegistryBuilder().build() ); 
它没有做适当的configuration。
 在Hibernate 5中,您需要构buildStandardServiceRegistry和Metadata来构buildSessionFactory 。 你可以使用下面的HibernateUtil来构buildSessionFactory 。  hibernate.cfg.xml应该在应用程序的类path的根目录下。 
 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; } } 
 另外,如果您使用Hibernate 5并使用@Id作为您的标识符生成策略,那么使用GenerationType.AUTO将在MySQL中默认select“序列”标识生成器,这会为您提供com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'SampleDB.hibernate_sequence' doesn't existexception,如果您没有在标识符属性的实体中configuration它。 所以在Hibernate 5中,改用GenerationType.IDENTITY 。 
您没有添加configuration文件
 configuration.configure("/hibernate.cfg.xml"); 
请确保已经创build了映射文件User.hbm.xml或User.xml文件,并将该文件包含在hibernate.cfg.xml中
我认为这是解决这个问题的一个简单的方法。
 @Entity @Table(name="User_table") public class User { @Id int userId; @Column(name = "User_Name") String userName; ................. 
使用这个:
 SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class); Session session = sessionFactory.openSession(); 
而不是这个:
 SessionFactory factory = new Configuration().configure().buildSessionFactory(); Session session = factory.openSession(); 
用Hibernate 5.2.10.Final解决了这个问题。
我面临着同样的问题,我search了近2个小时,尝试了不同的可能的方式,如更换旧的hibernatejar和更改数据库表架构。 但最终得到如下的解决scheme;
  //This line to be replaced with below commented line SessionFactory factory = new Configuration().configure().buildSessionFactory(); 
replace上面的
 Configuration config = new Configuration().configure(); ServiceRegistry servReg = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build(); SessionFactory factory = config.buildSessionFactory(servReg); 
它会很好的工作..
- HIbernate commit()和flush()
- 在序列化Hibernate对象时引发奇怪的jacksonexception
- 注释过滤@OneToMany关联的结果
- 不成功:在Hibernate / JPA / HSQLDB独立版本中使用alter table XXX drop constraint YYY
- 在@Column JPA annontation上设置length属性时会做些什么?
- Hibernate,@SequenceGenerator和allocationSize
- Hibernate中不同的保存方法有什么区别?
- 我应该先学什么,Spring或Hibernate?
- ConcurrentModificationException和一个HashMap