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:
Does someone know where might be the problem?
You have to call session.beginTransaction()
public void create(T entity) {
Session session=getSessionFactory().getCurrentSession();
Transaction trans=session.beginTransaction();
session.save(entity);
trans.commit();
}
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With