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 exist
exception,如果您没有在标识符属性的实体中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