2

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)
4
  • What's the DrAction class? Does it have all annotation or how hibernate understands it's entity? Commented Jan 16, 2015 at 10:53
  • The exception means DrAction isn't registered as entity in Hibernate. Post hibernate.cfg.xml and DrAction class. Commented Jan 16, 2015 at 10:54
  • can you post your DrAction class and hibernate configuration? Commented Jan 16, 2015 at 10:54
  • DrAction is the POJO class for the dr_action table. Updated my code to include all files in question. Commented Jan 16, 2015 at 11:02

3 Answers 3

3

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.

Sign up to request clarification or add additional context in comments.

15 Comments

So I am having 5 classes for 5 tables. Do I need to add each class entry to session-factory ?
Yes, and all of them should have @Entity and @Table annotations (@Table is necessary only if table name differs from entity name).
After adding a mapping to configuration file, I am getting a compile time error at <session-factory> tag that says - "The content of element type "session-factory" must match "(property*,mapping*,(class-cache|collection-cache)*,event*,listener*)"."
<mapping> elements should be added just before closing </session-factory> tag.
Now I am getting org.hibernate.exception.SQLGrammarException: could not extract ResultSet on the same save method. Any idea ?
|
1

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

3 Comments

After adding a mapping to configuration file, I am getting an error at <session-factory> tag that says - "The content of element type "session-factory" must match "(property*,mapping*,(class-cache|collection-cache)*,event*,listener*)"."
@MyGod can you post your dr_action schema?because the problem arises because of column name difference between entity and table and you have not defined and mapping to this.
I was having the same problem, despite the mapping in hibernate.cfg.xml being correct, as well as the annotations in the classes, and nothing resolved. After researching a lot about Hibernate 5.x.x., I found that beyond these settings, you need to add the line cfg.addAnnotatedClass (), in your case, cfg.addAnnotatedClass (DrAction.class), below the line configuration.configure ("hibernate.cfg.xml"). After that, it worked.
0

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.