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.xmlhibernate.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中,您需要构buildStandardServiceRegistryMetadata来构buildSessionFactory 。 你可以使用下面的HibernateUtil来构buildSessionFactoryhibernate.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); 

它会很好的工作..