14

org.hibernate.MappingException: Unknown entity当我尝试将 hibernate 5.0 与 mysql 集成时收到错误消息

这似乎是 hibernate5.0.0 和 5.0.1 的问题。这适用于休眠 4.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>

休眠.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();

    }

}

用户.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;
    }

}
4

6 回答 6

31

我用 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 有相同的问题。

当您这样做时configuration.buildSessionFactory(sr),使用 Hibernate 5Configuration会丢失有关通过调用获取的映射的所有信息configuration.configure()

解决方案

要解决这个问题,如果您使用标准配置文件hibernate.cfg.xmlhibernate.properties,您可以通过这种方式创建会话工厂(不带ServiceRegistry

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

加载属性

如果您在其他文件中有属性,则hibernate.properties可以使用构建会话工厂StandardServiceRegistryBuilder(无论如何,如果您有hibernate.properties其他文件,它将同时加载)

将属性作为资源加载

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

您需要hibernate-h2.properties在类路径中(源文件夹的根目录,资源文件夹)。您也可以从根源文件夹指定路径 /com/github/xxx/model/hibernate-h2.properties

从文件系统中的路径加载属性

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

您可以在此处fluent-hibernate-mysql找到使用此方法的示例控制台应用程序。它使用实用程序类从fluent-hibernate 库构建会话工厂。

不正确的 Hibernate 5 教程

Hibernate 5 教程1.1.6中有一个不正确的示例。启动和助手。它使用此代码

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

它没有进行正确的配置。

于 2015-09-22T08:08:05.983 回答
6

在 Hibernate 5 中,您需要构建StandardServiceRegistryMetadata构建SessionFactory. 您可以使用以下内容HibernateUtil来构建SessionFactory. hibernate.cfg.xml应该在应用程序的类路径的根目录中。

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其用作标识符生成策略,那么 usingGenerationType.AUTO将默认使用 MySQL 获取“序列”身份生成器com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'SampleDB.hibernate_sequence' doesn't exist,如果您没有在您的标识符属性处的实体。因此,使用 Hibernate 5,请GenerationType.IDENTITY改用。

于 2015-11-06T22:26:26.110 回答
0

我遇到了同样的问题,我搜索了将近 2 个小时,并尝试了不同的可能方式,比如替换旧的休眠 jars 和更改数据库表模式。但最终得到了如下解决方案;

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

将上面替换为

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

然后它会工作正常..

于 2017-07-04T06:03:30.877 回答
0

请确保您已创建映射文件 User.hbm.xml 或 User.xml 文件并将该文件包含在 hibernate.cfg.xml 中

于 2015-09-04T19:33:08.643 回答
0

您没有添加配置文件

configuration.configure("/hibernate.cfg.xml");
于 2015-09-04T19:20:28.470 回答
0

使用这个:

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 的问题。

于 2017-05-28T20:42:39.867 回答