Hibernate MappingException: Unknown entity on session save

6.2k Views Asked by At

I am getting exception on save operation to postgresql database using hibernate when I call addEventAction method from another class.

EventDAO.java:

package com.sessionpoint.session.sessiondr.core;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.sessionpoint.session.sessiondr.db.DrAction;

/**
 * Logic for the database operations related to the actions.
 *
 */
public class EventDAO {

   //To get the logger for class
   Logger log = Logger.getLogger("EventDAO");

    /**
     * Add dispatched event action into the database.
     * 
     * @param eventAction
     */
    public void addEventAction(DrAction eventAction) {
        Transaction trns = null;
        Session session = HibernateUtil.getSessionFactory().openSession();

        log.info("Connection with the database created successfuly.");

        try {
            trns = session.beginTransaction();
            session.save(eventAction); //exception here
            session.getTransaction().commit();
        } catch (RuntimeException e) {
            if (trns != null) {
                trns.rollback();
            }
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
    }
}

HibernateUtil.java:

public class HibernateUtil {
    private static SessionFactory sessionFactory;

    //To get the logger for class
    static Logger log = Logger.getLogger("HibernateUtil");

    static {

        log.info("Trying to create a connection with the database.");
        Configuration configuration = new Configuration();
        configuration.configure("hibernate.cfg.xml");
        StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties());
        sessionFactory = configuration.buildSessionFactory(ssrb.build());
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

Exception Trace:

org.hibernate.MappingException: Unknown entity: com.sessionpoint.session.sessiondr.db.DrAction
    at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:1094)
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1439)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:116)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:711)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:703)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:698)
    at com.sessionpoint.session.sessiondr.core.EventDAO.addEventAction(EventDAO.java:35)

UPDATE:

hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
        <property name="hibernate.connection.password">user</property>
        <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/drcore</property>
        <property name="hibernate.connection.username">postgres</property>
        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
    </session-factory>
</hibernate-configuration>

DrAction.java:

/**
 * DrAction for the dr_action table
 */
public class DrAction implements java.io.Serializable {

    /**
     * Default serial version Id.
     */
    private static final long serialVersionUID = 1L;

    /**
     * Auto increment drActionId.
     */
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long drActionId;
    private String drVName;
    private String drVRequestId;

    private Long vKey;

    public long getDrActionId() {
        return drActionId;
    }
    public void setDrActionId(long drActionId) {
        this.drActionId = drActionId;
    }
    public Long getvKey() {
        return vKey;
    }
    public void setvKey(Long vKey) {
        this.vKey = vKey;
    }
    public String getDrVName() {
        return drVName;
    }
    public void setDrVName(String drVName) {
        this.drVName = drVName;
    }
    public String getDrVRequestId() {
        return drVRequestId;
    }
    public void setDrVRequestId(String drVRequestId) {
        this.drVRequestId = drVRequestId;
    }
}

UPDATE:

Exception Trace 2:

org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:123)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:89)
    at org.hibernate.id.SequenceGenerator.generateHolder(SequenceGenerator.java:122)
    at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:115)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:117)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:711)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:703)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:698)
    at com.sessionpoint.session.sessiondr.core.EventDAO.addEventAction(EventDAO.java:35)    
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.postgresql.util.PSQLException: ERROR: relation "hibernate_sequence" does not exist
  Position: 17
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2157)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1886)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:555)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:417)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:302)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:80)

UPDATE:

Exception Trace 3:

Caused by: org.hibernate.MappingNotFoundException: resource: com/sessionpoint/session/sessiondr/db/DrAction.hbm.xml not found
    at org.hibernate.cfg.Configuration.addResource(Configuration.java:767)
    at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:2255)
    at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:2227)
    at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2207)
    at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2160)
    at org.hibernate.cfg.Configuration.configure(Configuration.java:2075)
    at com.sessionpoint.session.sessiondr.core.HibernateUtil.<clinit>(HibernateUtil.java:24)
3

There are 3 best solutions below

15
On BEST ANSWER

Add @Entity to DrAction class, and add <mapping class="your.package.DrAction"/> to hibernate.cfg.xml.

@Entity
@Table(name = "dr_action")
public class DrAction implements java.io.Serializable {

hibernate.cfg.xml

...
    <session-factory>
        ....
        <mapping class="your.package.DrAction"/>
    </session-factory>
....

UPDATE

You are probably using Oracle as DB, and Oracle doesn't support auto generated ids. You'll have to specify sequence that will be used for generating ids.

Execute this in database

create sequence DR_ACTION_SEQ;

And change the id mapping to this

@Id 
@GeneratedValue(generator="drActionIdSeq") 
@SequenceGenerator(name="drActionIdSeq",sequenceName="DR_ACTION_SEQ", allocationSize=5)
private long drActionId;

Note that this expects that your id column is named dractionid, if it is not then you'll have to add a @Column annotation to the field, something like this

@Column(name = "dr_action_id")

You will have to do this for every column whose name isn't the same as column in database table.

3
On

Add below lines to your hibernate.cfg.xml

<mapping class="xxx.yyy.DrAction"/>//provide full package name

and @Entity and @Table (name="dr_action") annotation onDrAction` class

0
On

The @GeneratedValue annotation in postgre use sequence tables. since you haven't explicitly provided a name hibernate by default looks for hibernate_sequence sequence table.

Either add a sequence table by name hibernate_sequence in postgre schema or by any other name and add the name in the annotation.