Hibernate 5 :- org.hibernate.MappingException: Unknown entity
Asked Answered
V

6

14

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

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

Maven dependices

<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 code

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

}
Viviyan answered 4/9, 2015 at 19:9 Comment(1)
Exception in thread "main" org.hibernate.MappingException: Unknown entity: UserA.User at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:776) at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1447) at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:100) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGenerViviyan
C
32

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

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.

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

Solution

To fix the issue, if you use standard configuration files hibernate.cfg.xml and hibernate.properties, you can create the session factory by this way (without 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.properties and other file, it will be loaded both)

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.properties in 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.

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.

Incorrect Hibernate 5 tutorial

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

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

It doesn't do a proper configuration.

Catharinecatharsis answered 22/9, 2015 at 8:8 Comment(3)
You saved my life :)Dull
every time I upgrade hibernate, my code works every each time.Atlantis
This worked perfectly! And it cut down on all the extra code! Thanks so much!Beguile
B
6

In Hibernate 5, you need to build StandardServiceRegistry and Metadata to build SessionFactory. You could use the following HibernateUtil to build SessionFactory. hibernate.cfg.xml should be in the root of the classpath of your application.

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 @Id as your identifier generation strategy then using GenerationType.AUTO will 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 exist exception, if you don't have it configured in your entities at identifier attributes. So with Hibernate 5, use GenerationType.IDENTITY instead.

Borodin answered 6/11, 2015 at 22:26 Comment(0)
F
0

You didn't add a configuration file

configuration.configure("/hibernate.cfg.xml");
Fertile answered 4/9, 2015 at 19:20 Comment(3)
docs.jboss.org/hibernate/orm/5.0/javadocs/org/hibernate/cfg/… the configure() method without parameter assumes a file hibernate.cfg.xml needs to be loaded.Kinsley
Thanks a lot for the response. That did not help me. I have already tried thisViviyan
This is a bug in 5.0 Hibernate. I have verified that the code works fine with 4.3.9 but breaks in 5.0Viviyan
F
0

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

Fielder answered 4/9, 2015 at 19:33 Comment(1)
Thanks a lot Chetan. I was under the impression that User.hbm.xml is not required for hibernate 5.0 as i am using the annotations. I will also try your solution .Viviyan
K
0

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.

Kartis answered 28/5, 2017 at 20:42 Comment(0)
M
0

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;

 //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..

Mt answered 4/7, 2017 at 6:3 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.