Java 休眠 5 :- org.hibernate.MappingException: 未知实体

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/32405031/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 12:29:06  来源:igfitidea点击:

Hibernate 5 :- org.hibernate.MappingException: Unknown entity

javamysqlhibernatehibernate-5.x

提问by Mamta Garg

I am getting the error message org.hibernate.MappingException: Unknown entitywhen i am trying to integrate hibernate 5.0 with mysql

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

This seems to be an issue with hibernate5.0.0 and 5.0.1 . This works fine with hibernate 4.3.9

这似乎是 hibernate5.0.0 和 5.0.1 的问题。这适用于休眠 4.3.9

Maven dependices

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

休眠文件.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 code

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

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

}

回答by Mamta Garg

You didn't add a configuration file

你没有添加配置文件

configuration.configure("/hibernate.cfg.xml");

回答by Chetan chadha

Please make sure that you have created mapping file User.hbm.xml or User.xml file and included that file in hibernate.cfg.xml

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

回答by v.ladynev

I have fixed the same issue with Hibernate 5. There is a problem in this code

我已经用 Hibernate 5 解决了同样的问题。这段代码有问题

Configuration configuration = new Configuration();
configuration.configure();

ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(
    configuration.getProperties()).build();

SessionFactory sf = configuration.buildSessionFactory(sr);

This code works fine for Hibernate 4.3.5, but the same code has the same issue for Hibernate 5.

这段代码适用于 Hibernate 4.3.5,但同样的代码对于 Hibernate 5 也有同样的问题。

When you do configuration.buildSessionFactory(sr), using Hibernate 5, Configurationlosts all information about mapping that gets by call configuration.configure().

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

Solution

解决方案

To fix the issue, if you use standard configuration files hibernate.cfg.xmland hibernate.properties, you can create the session factory by this way (without ServiceRegistry)

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

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

Loading properties

加载属性

If you have properties in a file other then hibernate.properties, you can build session factory using StandardServiceRegistryBuilder(anyway, if you have hibernate.propertiesand other file, it will be loaded both)

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

To load properties as a resource

将属性作为资源加载

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

You need to have hibernate-h2.propertiesin the class path (root of the sources folder, resources folder). You can specify a path from the root source folder too /com/github/xxx/model/hibernate-h2.properties.

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

To load properties from a path in the file system

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

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

You can find an example console application using this approach here fluent-hibernate-mysql. It uses a utility class to build the session factory from the fluent-hibernate library.

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

Incorrect Hibernate 5 tutorial

不正确的 Hibernate 5 教程

There is an incorrect example in Hibernate 5 tutorial 1.1.6. Startup and helpers. It uses this code

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

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

It doesn't do a proper configuration.

它没有进行适当的配置。

回答by skip

In Hibernate 5, you need to build StandardServiceRegistryand Metadatato build SessionFactory. You could use the following HibernateUtilto build SessionFactory. hibernate.cfg.xmlshould be in the root of the classpath of your application.

在 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;
    }

}

Also, If you're using Hibernate 5 and using @Idas your identifier generation strategy then using GenerationType.AUTOwill pick up the "sequence" identity generator by default with MySQL, which will give you an the com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'SampleDB.hibernate_sequence' doesn't existexception, if you don't have it configured in your entities at identifier attributes. So with Hibernate 5, use GenerationType.IDENTITYinstead.

此外,如果您使用 Hibernate 5 并@Id用作标识符生成策略,那么 usingGenerationType.AUTO将默认使用 MySQL 选择“序列”身份生成器com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'SampleDB.hibernate_sequence' doesn't exist,如果您没有在您的标识符属性处的实体。因此,对于 Hibernate 5,请GenerationType.IDENTITY改用。

回答by zygimantus

Using this:

使用这个:

SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);

Session session = sessionFactory.openSession();

instead of this:

而不是这个:

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

Session session = factory.openSession();

solved the issue with Hibernate 5.2.10.Final.

用 Hibernate 5.2.10.Final 解决了这个问题。

回答by JR Sahoo.'JS'

I was facing the same issue & I searched for almost 2 hours and tried with different possible ways like replacing old hibernate jars&changing the db table schema. But finally got the solution as below;

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

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

Replace above for

替换上面的

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

It will then work fine..

然后它会正常工作..