Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

org.hibernate.HibernateException: save is not valid without active transaction

I am creating JSF application and using some hibernate stuff in it. All I want to do is to save the entity into the database but I keep getting this exception:

org.hibernate.HibernateException: save is not valid without active transaction

At first I was getting this exception:

org.hibernate.HibernateException: No CurrentSessionContext configured!

Then I found that I need to add this into my hibernate configuration:

<property name="hibernate.current_session_context_class">thread</property>

This solved this issue but now the above one appears. I am saving entity into database like this:

public void create(T entity) {
    getSessionFactory().getCurrentSession().save(entity);
}

My hibernate.cfg.xml file looks like this:

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/online_tests_management</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="hibernate.current_session_context_class">thread</property>

        <mapping class="com.groupgti.onlinetests.management.db.Service"/>
    </session-factory>
</hibernate-configuration>

I am using:

  • Hibernate-4.1.4.Final
  • JDK 1.6
  • Tomcat 6
  • JSF 2.0
  • PrimeFaces 3.3.1
  • MySql

Does someone know where might be the problem?

like image 586
Paulius Matulionis Avatar asked Aug 17 '12 08:08

Paulius Matulionis


4 Answers

You have to call session.beginTransaction()

public void create(T entity) {
   Session session=getSessionFactory().getCurrentSession();
   Transaction trans=session.beginTransaction();
   session.save(entity);
   trans.commit();
}
like image 126
KV Prajapati Avatar answered Sep 20 '22 03:09

KV Prajapati


Try changing your method to be as follows:

public void create(T entity) {
    getSessionFactory().getCurrentSession().beginTransaction();
    getSessionFactory().getCurrentSession().save(entity);
    getSessionFactory().getCurrentSession().endTransaction();
}

Should solve your problem.

like image 44
DB5 Avatar answered Sep 19 '22 03:09

DB5


Do it like this:

  public void create(T entity) {
       org.hibernate.Session ss= getSessionFactory().getCurrentSession();
       Transaction tx=ss.beginTransaction();
       ss.save(entity);
       tx.commit();    
  }

Do the exception handling part yourself.

like image 43
Dangling Piyush Avatar answered Sep 20 '22 03:09

Dangling Piyush


I think you'll find something like this is more robust and appropriate:

Session session = factory.openSession();
Transaction tx = null;
try {
   tx = session.beginTransaction();

   // Do some work like:
   //session.load(...);
   //session.persist(...);
   //session.save(...);

   tx.commit(); // Flush happens automatically
}
catch (RuntimeException e) {
   tx.rollback();
   throw e; // or display error message
}
finally {
    session.close();
}

You cannot "close" the transaction, you can close the session, as you can see. Read this here, it might be useful for you.

like image 34
Less Avatar answered Sep 20 '22 03:09

Less